Title: [276952] trunk/Source
Revision
276952
Author
you...@apple.com
Date
2021-05-04 03:04:29 -0700 (Tue, 04 May 2021)

Log Message

Use OptionSet for MediaProducer::MediaStateFlags
https://bugs.webkit.org/show_bug.cgi?id=225227

Reviewed by Eric Carlson.

Source/WebCore:

Update code to use a safer MediaProducer::MediaStateFlags type.

No change of behavior, this is a refactoring.

* Modules/airplay/WebMediaSessionManager.cpp:
(WebCore::flagsAreSet):
(WebCore::mediaProducerStateString):
(WebCore::WebMediaSessionManager::showPlaybackTargetPicker):
(WebCore::WebMediaSessionManager::clientStateDidChange):
(WebCore::WebMediaSessionManager::configurePlaybackTargetClients):
(WebCore::WebMediaSessionManager::configurePlaybackTargetMonitoring):
(WebCore::WebMediaSessionManager::configureWatchdogTimer):
* Modules/mediastream/MediaStream.cpp:
(WebCore::MediaStream::mediaState const):
* Modules/mediastream/MediaStream.h:
* Modules/mediastream/MediaStreamTrack.cpp:
(WebCore::sourceCaptureState):
(WebCore::MediaStreamTrack::captureState):
* Modules/webaudio/AudioContext.cpp:
(WebCore::AudioContext::mediaState const):
(WebCore::AudioContext::visibilityStateChanged):
* dom/Document.cpp:
(WebCore::Document::willBeRemovedFromFrame):
(WebCore::Document::updateIsPlayingMedia):
* dom/Document.h:
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::shouldOverrideBackgroundPlaybackRestriction const):
(WebCore::HTMLMediaElement::mediaState const):
* html/HTMLMediaElement.h:
* html/MediaElementSession.cpp:
(WebCore::MediaElementSession::playbackStateChangePermitted const):
* page/MediaProducer.h:
(WebCore::MediaProducer::isCapturing):
* page/Page.cpp:
(WebCore::Page::updateIsPlayingMedia):
* page/Page.h:
* testing/Internals.cpp:
(WebCore::Internals::pageMediaState):

Source/WebKit:

Update code according safer MediaProducer::MediaStateFlags type.

* UIProcess/API/C/WKPage.cpp:
(WKPageGetMediaState):
* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView cameraCaptureState]):
(-[WKWebView microphoneCaptureState]):
* UIProcess/Cocoa/MediaUtilities.mm:
(WebKit::toWKMediaCaptureStateDeprecated):
* UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
(WebKit::UserMediaPermissionRequestManagerProxy::captureStateChanged):
* UIProcess/UserMediaPermissionRequestManagerProxy.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::updateActivityState):
(WebKit::WebPageProxy::setMuted):
(WebKit::WebPageProxy::updatePlayingMediaDidChange):
(WebKit::WebPageProxy::updateReportedMediaCaptureState):
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.messages.in:
* WebProcess/Plugins/PluginView.h:
(WebKit::PluginView::mediaState const):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (276951 => 276952)


--- trunk/Source/WebCore/ChangeLog	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebCore/ChangeLog	2021-05-04 10:04:29 UTC (rev 276952)
@@ -1,3 +1,49 @@
+2021-05-04  Youenn Fablet  <you...@apple.com>
+
+        Use OptionSet for MediaProducer::MediaStateFlags
+        https://bugs.webkit.org/show_bug.cgi?id=225227
+
+        Reviewed by Eric Carlson.
+
+        Update code to use a safer MediaProducer::MediaStateFlags type.
+
+        No change of behavior, this is a refactoring.
+
+        * Modules/airplay/WebMediaSessionManager.cpp:
+        (WebCore::flagsAreSet):
+        (WebCore::mediaProducerStateString):
+        (WebCore::WebMediaSessionManager::showPlaybackTargetPicker):
+        (WebCore::WebMediaSessionManager::clientStateDidChange):
+        (WebCore::WebMediaSessionManager::configurePlaybackTargetClients):
+        (WebCore::WebMediaSessionManager::configurePlaybackTargetMonitoring):
+        (WebCore::WebMediaSessionManager::configureWatchdogTimer):
+        * Modules/mediastream/MediaStream.cpp:
+        (WebCore::MediaStream::mediaState const):
+        * Modules/mediastream/MediaStream.h:
+        * Modules/mediastream/MediaStreamTrack.cpp:
+        (WebCore::sourceCaptureState):
+        (WebCore::MediaStreamTrack::captureState):
+        * Modules/webaudio/AudioContext.cpp:
+        (WebCore::AudioContext::mediaState const):
+        (WebCore::AudioContext::visibilityStateChanged):
+        * dom/Document.cpp:
+        (WebCore::Document::willBeRemovedFromFrame):
+        (WebCore::Document::updateIsPlayingMedia):
+        * dom/Document.h:
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::shouldOverrideBackgroundPlaybackRestriction const):
+        (WebCore::HTMLMediaElement::mediaState const):
+        * html/HTMLMediaElement.h:
+        * html/MediaElementSession.cpp:
+        (WebCore::MediaElementSession::playbackStateChangePermitted const):
+        * page/MediaProducer.h:
+        (WebCore::MediaProducer::isCapturing):
+        * page/Page.cpp:
+        (WebCore::Page::updateIsPlayingMedia):
+        * page/Page.h:
+        * testing/Internals.cpp:
+        (WebCore::Internals::pageMediaState):
+
 2021-05-04  Diego Pino Garcia  <dp...@igalia.com>
 
         Unreviewed, fix GTK and WPE builds after r276947

Modified: trunk/Source/WebCore/Modules/airplay/WebMediaSessionManager.cpp (276951 => 276952)


--- trunk/Source/WebCore/Modules/airplay/WebMediaSessionManager.cpp	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebCore/Modules/airplay/WebMediaSessionManager.cpp	2021-05-04 10:04:29 UTC (rev 276952)
@@ -58,7 +58,7 @@
 
     WebMediaSessionManagerClient& client;
     PlaybackTargetClientContextIdentifier contextId;
-    WebCore::MediaProducer::MediaStateFlags flags { WebCore::MediaProducer::IsNotPlaying };
+    WebCore::MediaProducer::MediaStateFlags flags;
     bool requestedPicker { false };
     bool previouslyRequestedPicker { false };
     bool configurationRequired { true };
@@ -65,29 +65,29 @@
     bool playedToEnd { false };
 };
 
-static bool flagsAreSet(MediaProducer::MediaStateFlags value, unsigned flags)
+static bool flagsAreSet(MediaProducer::MediaStateFlags value, MediaProducer::MediaStateFlags flags)
 {
-    return value & flags;
+    return value.containsAny(flags);
 }
 
 String mediaProducerStateString(MediaProducer::MediaStateFlags flags)
 {
     StringBuilder string;
-    if (flags & MediaProducer::IsPlayingAudio)
+    if (flags & MediaProducer::MediaState::IsPlayingAudio)
         string.append("IsPlayingAudio+");
-    if (flags & MediaProducer::IsPlayingVideo)
+    if (flags & MediaProducer::MediaState::IsPlayingVideo)
         string.append("IsPlayingVideo+");
-    if (flags & MediaProducer::IsPlayingToExternalDevice)
+    if (flags & MediaProducer::MediaState::IsPlayingToExternalDevice)
         string.append("IsPlayingToExternalDevice+");
-    if (flags & MediaProducer::HasPlaybackTargetAvailabilityListener)
+    if (flags & MediaProducer::MediaState::HasPlaybackTargetAvailabilityListener)
         string.append("HasTargetAvailabilityListener+");
-    if (flags & MediaProducer::RequiresPlaybackTargetMonitoring)
+    if (flags & MediaProducer::MediaState::RequiresPlaybackTargetMonitoring)
         string.append("RequiresTargetMonitoring+");
-    if (flags & MediaProducer::ExternalDeviceAutoPlayCandidate)
+    if (flags & MediaProducer::MediaState::ExternalDeviceAutoPlayCandidate)
         string.append("ExternalDeviceAutoPlayCandidate+");
-    if (flags & MediaProducer::DidPlayToEnd)
+    if (flags & MediaProducer::MediaState::DidPlayToEnd)
         string.append("DidPlayToEnd+");
-    if (flags & MediaProducer::HasAudioOrVideo)
+    if (flags & MediaProducer::MediaState::HasAudioOrVideo)
         string.append("HasAudioOrVideo+");
     if (string.isEmpty())
         string.append("IsNotPlaying");
@@ -255,7 +255,7 @@
 
     ALWAYS_LOG_MEDIASESSIONMANAGER(__func__, m_clientState[index].get());
 
-    bool hasActiveRoute = flagsAreSet(m_clientState[index]->flags, MediaProducer::IsPlayingToExternalDevice);
+    bool hasActiveRoute = flagsAreSet(m_clientState[index]->flags, MediaProducer::MediaState::IsPlayingToExternalDevice);
     targetPicker().showPlaybackTargetPicker(client.platformView(), FloatRect(rect), hasActiveRoute, useDarkAppearance, client.useiTunesAVOutputContext());
 }
 
@@ -275,18 +275,18 @@
 
     changedClientState->flags = newFlags;
 
-    MediaProducer::MediaStateFlags updateConfigurationFlags = MediaProducer::RequiresPlaybackTargetMonitoring | MediaProducer::HasPlaybackTargetAvailabilityListener | MediaProducer::HasAudioOrVideo;
+    constexpr MediaProducer::MediaStateFlags updateConfigurationFlags { MediaProducer::MediaState::RequiresPlaybackTargetMonitoring, MediaProducer::MediaState::HasPlaybackTargetAvailabilityListener, MediaProducer::MediaState::HasAudioOrVideo };
     if ((oldFlags & updateConfigurationFlags) != (newFlags & updateConfigurationFlags))
         scheduleDelayedTask(TargetMonitoringConfigurationTask);
 
-    MediaProducer::MediaStateFlags playingToTargetFlags = MediaProducer::IsPlayingToExternalDevice | MediaProducer::IsPlayingVideo;
+    constexpr MediaProducer::MediaStateFlags playingToTargetFlags { MediaProducer::MediaState::IsPlayingToExternalDevice, MediaProducer::MediaState::IsPlayingVideo };
     if ((oldFlags & playingToTargetFlags) != (newFlags & playingToTargetFlags)) {
-        if (flagsAreSet(oldFlags, MediaProducer::IsPlayingVideo) && !flagsAreSet(newFlags, MediaProducer::IsPlayingVideo) && flagsAreSet(newFlags, MediaProducer::DidPlayToEnd))
+        if (flagsAreSet(oldFlags, MediaProducer::MediaState::IsPlayingVideo) && !flagsAreSet(newFlags, MediaProducer::MediaState::IsPlayingVideo) && flagsAreSet(newFlags, MediaProducer::MediaState::DidPlayToEnd))
             changedClientState->playedToEnd = true;
         scheduleDelayedTask(WatchdogTimerConfigurationTask);
     }
 
-    if (!m_playbackTarget || !m_playbackTarget->hasActiveRoute() || !flagsAreSet(newFlags, MediaProducer::ExternalDeviceAutoPlayCandidate))
+    if (!m_playbackTarget || !m_playbackTarget->hasActiveRoute() || !flagsAreSet(newFlags, MediaProducer::MediaState::ExternalDeviceAutoPlayCandidate))
         return;
 
     // Do not interrupt another element already playing to a device.
@@ -294,7 +294,7 @@
         if (state == changedClientState)
             continue;
 
-        if (flagsAreSet(state->flags, MediaProducer::IsPlayingToExternalDevice) && flagsAreSet(state->flags, MediaProducer::IsPlayingVideo)) {
+        if (flagsAreSet(state->flags, MediaProducer::MediaState::IsPlayingToExternalDevice) && flagsAreSet(state->flags, MediaProducer::MediaState::IsPlayingVideo)) {
             ALWAYS_LOG_MEDIASESSIONMANAGER(__func__, state.get(), " returning early");
             return;
         }
@@ -301,7 +301,7 @@
     }
 
     // Do not begin playing to the device unless playback has just started.
-    if (!flagsAreSet(newFlags, MediaProducer::IsPlayingVideo) || flagsAreSet(oldFlags, MediaProducer::IsPlayingVideo)) {
+    if (!flagsAreSet(newFlags, MediaProducer::MediaState::IsPlayingVideo) || flagsAreSet(oldFlags, MediaProducer::MediaState::IsPlayingVideo)) {
         ALWAYS_LOG_MEDIASESSIONMANAGER(__func__, "returning early, playback didn't just start");
         return;
     }
@@ -376,7 +376,7 @@
         if ((m_targetChanged || m_playbackTargetPickerDismissed) && state->requestedPicker)
             indexOfClientThatRequestedPicker = i;
 
-        if (indexOfClientWillPlayToTarget == notFound && flagsAreSet(state->flags, MediaProducer::IsPlayingToExternalDevice))
+        if (indexOfClientWillPlayToTarget == notFound && flagsAreSet(state->flags, MediaProducer::MediaState::IsPlayingToExternalDevice))
             indexOfClientWillPlayToTarget = i;
 
         if (indexOfClientWillPlayToTarget == notFound && haveActiveRoute && state->previouslyRequestedPicker)
@@ -387,7 +387,7 @@
         indexOfClientWillPlayToTarget = indexOfClientThatRequestedPicker;
     if (indexOfClientWillPlayToTarget == notFound && indexOfLastClientToRequestPicker != notFound)
         indexOfClientWillPlayToTarget = indexOfLastClientToRequestPicker;
-    if (indexOfClientWillPlayToTarget == notFound && haveActiveRoute && flagsAreSet(m_clientState[0]->flags, MediaProducer::ExternalDeviceAutoPlayCandidate) && !flagsAreSet(m_clientState[0]->flags, MediaProducer::IsPlayingVideo))
+    if (indexOfClientWillPlayToTarget == notFound && haveActiveRoute && flagsAreSet(m_clientState[0]->flags, MediaProducer::MediaState::ExternalDeviceAutoPlayCandidate) && !flagsAreSet(m_clientState[0]->flags, MediaProducer::MediaState::IsPlayingVideo))
         indexOfClientWillPlayToTarget = 0;
 
     for (size_t i = 0; i < m_clientState.size(); ++i) {
@@ -413,7 +413,7 @@
 
     if (haveActiveRoute && indexOfClientWillPlayToTarget != notFound) {
         auto& state = m_clientState[indexOfClientWillPlayToTarget];
-        if (!flagsAreSet(state->flags, MediaProducer::IsPlayingToExternalDevice)) {
+        if (!flagsAreSet(state->flags, MediaProducer::MediaState::IsPlayingToExternalDevice)) {
             ALWAYS_LOG_MEDIASESSIONMANAGER(__func__, state.get(), " calling setShouldPlayToPlaybackTarget(true)");
             state->client.setShouldPlayToPlaybackTarget(state->contextId, true);
         }
@@ -430,13 +430,13 @@
     bool haveClientWithMedia = false;
     for (auto& state : m_clientState) {
         ALWAYS_LOG_MEDIASESSIONMANAGER(__func__, state.get());
-        if (state->flags & MediaProducer::RequiresPlaybackTargetMonitoring) {
+        if (state->flags & MediaProducer::MediaState::RequiresPlaybackTargetMonitoring) {
             monitoringRequired = true;
             break;
         }
-        if (state->flags & MediaProducer::HasPlaybackTargetAvailabilityListener)
+        if (state->flags & MediaProducer::MediaState::HasPlaybackTargetAvailabilityListener)
             hasAvailabilityListener = true;
-        if (state->flags & MediaProducer::HasAudioOrVideo)
+        if (state->flags & MediaProducer::MediaState::HasAudioOrVideo)
             haveClientWithMedia = true;
     }
 
@@ -500,7 +500,7 @@
 
         ALWAYS_LOG_MEDIASESSIONMANAGER(__func__, state.get(), " playedToEnd = ", state->playedToEnd);
 
-        if (flagsAreSet(state->flags, MediaProducer::IsPlayingToExternalDevice) && flagsAreSet(state->flags, MediaProducer::IsPlayingVideo))
+        if (flagsAreSet(state->flags, MediaProducer::MediaState::IsPlayingToExternalDevice) && flagsAreSet(state->flags, MediaProducer::MediaState::IsPlayingVideo))
             stopTimer = true;
         if (state->playedToEnd)
             didPlayToEnd = true;

Modified: trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp (276951 => 276952)


--- trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp	2021-05-04 10:04:29 UTC (rev 276952)
@@ -279,13 +279,13 @@
 
 MediaProducer::MediaStateFlags MediaStream::mediaState() const
 {
-    MediaProducer::MediaStateFlags state = MediaProducer::IsNotPlaying;
+    MediaProducer::MediaStateFlags state;
 
     if (!m_isActive || !document() || !document()->page())
         return state;
 
     for (const auto& track : m_trackSet.values())
-        state |= track->mediaState();
+        state.add(track->mediaState());
 
     return state;
 }

Modified: trunk/Source/WebCore/Modules/mediastream/MediaStream.h (276951 => 276952)


--- trunk/Source/WebCore/Modules/mediastream/MediaStream.h	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStream.h	2021-05-04 10:04:29 UTC (rev 276952)
@@ -140,7 +140,7 @@
 
     HashMap<String, RefPtr<MediaStreamTrack>> m_trackSet;
 
-    MediaProducer::MediaStateFlags m_state { MediaProducer::IsNotPlaying };
+    MediaProducer::MediaStateFlags m_state;
 
     bool m_isActive { false };
     bool m_isProducingData { false };

Modified: trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp (276951 => 276952)


--- trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp	2021-05-04 10:04:29 UTC (rev 276952)
@@ -418,28 +418,28 @@
     switch (source.deviceType()) {
     case CaptureDevice::DeviceType::Microphone:
         if (source.muted())
-            return MediaProducer::HasMutedAudioCaptureDevice;
+            return MediaProducer::MediaState::HasMutedAudioCaptureDevice;
         if (source.interrupted())
-            return MediaProducer::HasInterruptedAudioCaptureDevice;
+            return MediaProducer::MediaState::HasInterruptedAudioCaptureDevice;
         if (source.isProducingData())
-            return MediaProducer::HasActiveAudioCaptureDevice;
+            return MediaProducer::MediaState::HasActiveAudioCaptureDevice;
         break;
     case CaptureDevice::DeviceType::Camera:
         if (source.muted())
-            return MediaProducer::HasMutedVideoCaptureDevice;
+            return MediaProducer::MediaState::HasMutedVideoCaptureDevice;
         if (source.interrupted())
-            return MediaProducer::HasInterruptedVideoCaptureDevice;
+            return MediaProducer::MediaState::HasInterruptedVideoCaptureDevice;
         if (source.isProducingData())
-            return MediaProducer::HasActiveVideoCaptureDevice;
+            return MediaProducer::MediaState::HasActiveVideoCaptureDevice;
         break;
     case CaptureDevice::DeviceType::Screen:
     case CaptureDevice::DeviceType::Window:
         if (source.muted())
-            return MediaProducer::HasMutedDisplayCaptureDevice;
+            return MediaProducer::MediaState::HasMutedDisplayCaptureDevice;
         if (source.interrupted())
-            return MediaProducer::HasInterruptedDisplayCaptureDevice;
+            return MediaProducer::MediaState::HasInterruptedDisplayCaptureDevice;
         if (source.isProducingData())
-            return MediaProducer::HasActiveDisplayCaptureDevice;
+            return MediaProducer::MediaState::HasActiveDisplayCaptureDevice;
         break;
     case CaptureDevice::DeviceType::Speaker:
     case CaptureDevice::DeviceType::Unknown:
@@ -451,11 +451,11 @@
 
 MediaProducer::MediaStateFlags MediaStreamTrack::captureState(Document& document)
 {
-    MediaProducer::MediaStateFlags state = MediaProducer::IsNotPlaying;
+    MediaProducer::MediaStateFlags state;
     for (auto* captureTrack : allCaptureTracks()) {
         if (captureTrack->document() != &document || captureTrack->ended())
             continue;
-        state |= sourceCaptureState(captureTrack->source());
+        state.add(sourceCaptureState(captureTrack->source()));
     }
     return state;
 }

Modified: trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp (276951 => 276952)


--- trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp	2021-05-04 10:04:29 UTC (rev 276952)
@@ -350,7 +350,7 @@
 MediaProducer::MediaStateFlags AudioContext::mediaState() const
 {
     if (!isStopped() && destination().isPlayingAudio())
-        return MediaProducer::IsPlayingAudio;
+        return MediaProducer::MediaState::IsPlayingAudio;
 
     return MediaProducer::IsNotPlaying;
 }
@@ -408,7 +408,7 @@
 void AudioContext::visibilityStateChanged()
 {
     // Do not suspend if audio is audible.
-    if (!document() || mediaState() == MediaProducer::IsPlayingAudio || isStopped())
+    if (!document() || mediaState() == MediaProducer::MediaState::IsPlayingAudio || isStopped())
         return;
 
     if (document()->hidden()) {

Modified: trunk/Source/WebCore/dom/Document.cpp (276951 => 276952)


--- trunk/Source/WebCore/dom/Document.cpp	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebCore/dom/Document.cpp	2021-05-04 10:04:29 UTC (rev 276952)
@@ -2638,7 +2638,7 @@
 
     m_cachedResourceLoader->stopUnusedPreloadsTimer();
 
-    if (page() && m_mediaState != MediaProducer::IsNotPlaying) {
+    if (page() && !m_mediaState.isEmpty()) {
         m_mediaState = MediaProducer::IsNotPlaying;
         page()->updateIsPlayingMedia(HTMLMediaElementInvalidID);
     }
@@ -4448,18 +4448,18 @@
 void Document::updateIsPlayingMedia(uint64_t sourceElementID)
 {
     ASSERT(!m_audioProducers.hasNullReferences());
-    MediaProducer::MediaStateFlags state = MediaProducer::IsNotPlaying;
+    MediaProducer::MediaStateFlags state;
     for (auto& audioProducer : m_audioProducers)
-        state |= audioProducer.mediaState();
+        state.add(audioProducer.mediaState());
 
 #if ENABLE(MEDIA_STREAM)
-    state |= MediaStreamTrack::captureState(*this);
+    state.add(MediaStreamTrack::captureState(*this));
     if (m_activeSpeechRecognition)
-        state |= MediaProducer::HasActiveAudioCaptureDevice;
+        state.add(MediaProducer::MediaState::HasActiveAudioCaptureDevice);
 #endif
 
     if (m_userHasInteractedWithMediaElement)
-        state |= MediaProducer::HasUserInteractedWithMediaElement;
+        state.add(MediaProducer::MediaState::HasUserInteractedWithMediaElement);
 
     if (state == m_mediaState)
         return;

Modified: trunk/Source/WebCore/dom/Document.h (276951 => 276952)


--- trunk/Source/WebCore/dom/Document.h	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebCore/dom/Document.h	2021-05-04 10:04:29 UTC (rev 276952)
@@ -2047,7 +2047,7 @@
     unsigned m_writeRecursionDepth { 0 };
 
     InheritedBool m_designMode { inherit };
-    MediaProducer::MediaStateFlags m_mediaState { MediaProducer::IsNotPlaying };
+    MediaProducer::MediaStateFlags m_mediaState;
     bool m_userHasInteractedWithMediaElement { false };
     BackForwardCacheState m_backForwardCacheState { NotInBackForwardCache };
     Optional<ReferrerPolicy> m_referrerPolicy;

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (276951 => 276952)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2021-05-04 10:04:29 UTC (rev 276952)
@@ -7698,7 +7698,7 @@
             return true;
 #endif
 #if ENABLE(MEDIA_STREAM)
-        if (hasMediaStreamSrcObject() && mediaState() & IsPlayingAudio && document().mediaState() & MediaProducer::HasActiveAudioCaptureDevice) {
+        if (hasMediaStreamSrcObject() && mediaState().containsAny(MediaProducer::MediaState::IsPlayingAudio) && document().mediaState().containsAny(MediaProducer::MediaState::HasActiveAudioCaptureDevice)) {
             INFO_LOG(LOGIDENTIFIER, "returning true because playing an audio MediaStreamTrack");
             return true;
         }
@@ -7713,7 +7713,7 @@
             return true;
         }
 #if ENABLE(MEDIA_STREAM)
-        if (hasMediaStreamSrcObject() && mediaState() & IsPlayingAudio && document().mediaState() & MediaProducer::HasActiveAudioCaptureDevice) {
+        if (hasMediaStreamSrcObject() && mediaState().containsAny(MediaProducer::MediaState::IsPlayingAudio) && document().mediaState().containsAny(MediaProducer::MediaState::HasActiveAudioCaptureDevice)) {
             INFO_LOG(LOGIDENTIFIER, "returning true because playing an audio MediaStreamTrack");
             return true;
         }
@@ -7773,29 +7773,29 @@
 
 MediaProducer::MediaStateFlags HTMLMediaElement::mediaState() const
 {
-    MediaStateFlags state = IsNotPlaying;
+    MediaStateFlags state;
 
     bool hasActiveVideo = isVideo() && hasVideo();
     bool hasAudio = this->hasAudio();
     if (isPlayingToExternalTarget())
-        state |= IsPlayingToExternalDevice;
+        state.add(MediaProducer::MediaState::IsPlayingToExternalDevice);
 
 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
     if (m_hasPlaybackTargetAvailabilityListeners) {
-        state |= HasPlaybackTargetAvailabilityListener;
+        state.add(MediaProducer::MediaState::HasPlaybackTargetAvailabilityListener);
         if (!mediaSession().wirelessVideoPlaybackDisabled())
-            state |= RequiresPlaybackTargetMonitoring;
+            state.add(MediaProducer::MediaState::RequiresPlaybackTargetMonitoring);
     }
 
     bool requireUserGesture = mediaSession().hasBehaviorRestriction(MediaElementSession::RequireUserGestureToAutoplayToExternalDevice);
     if (m_readyState >= HAVE_METADATA && !requireUserGesture && !m_failedToPlayToWirelessTarget)
-        state |= ExternalDeviceAutoPlayCandidate;
+        state.add(MediaProducer::MediaState::ExternalDeviceAutoPlayCandidate);
 
     if (hasActiveVideo || hasAudio)
-        state |= HasAudioOrVideo;
+        state.add(MediaProducer::MediaState::HasAudioOrVideo);
 
     if (hasActiveVideo && endedPlayback())
-        state |= DidPlayToEnd;
+        state.add(MediaProducer::MediaState::DidPlayToEnd);
 #endif
 
     if (!isPlaying())
@@ -7809,10 +7809,10 @@
     isPlayingAudio = isPlayingAudio && !muted();
 #endif
     if (isPlayingAudio)
-        state |= IsPlayingAudio;
+        state.add(MediaProducer::MediaState::IsPlayingAudio);
 
     if (hasActiveVideo)
-        state |= IsPlayingVideo;
+        state.add(MediaProducer::MediaState::IsPlayingVideo);
 
     return state;
 }

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (276951 => 276952)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2021-05-04 10:04:29 UTC (rev 276952)
@@ -1187,7 +1187,7 @@
 #endif
 
 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
-    MediaProducer::MediaStateFlags m_mediaState { MediaProducer::IsNotPlaying };
+    MediaProducer::MediaStateFlags m_mediaState;
     MonotonicTime m_currentPlaybackTargetIsWirelessEventFiredTime;
     bool m_hasPlaybackTargetAvailabilityListeners { false };
     bool m_failedToPlayToWirelessTarget { false };

Modified: trunk/Source/WebCore/html/MediaElementSession.cpp (276951 => 276952)


--- trunk/Source/WebCore/html/MediaElementSession.cpp	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebCore/html/MediaElementSession.cpp	2021-05-04 10:04:29 UTC (rev 276952)
@@ -359,7 +359,7 @@
     if (m_element.hasMediaStreamSrcObject()) {
         if (document.isCapturing())
             return { };
-        if (document.mediaState() & MediaProducer::IsPlayingAudio)
+        if (document.mediaState() & MediaProducer::MediaState::IsPlayingAudio)
             return { };
     }
 #endif
@@ -374,7 +374,7 @@
         return MediaPlaybackDenialReason::UserGestureRequired;
     }
 
-    if (topDocument.mediaState() & MediaProducer::HasUserInteractedWithMediaElement && topDocument.quirks().needsPerDocumentAutoplayBehavior())
+    if (topDocument.mediaState() & MediaProducer::MediaState::HasUserInteractedWithMediaElement && topDocument.quirks().needsPerDocumentAutoplayBehavior())
         return { };
 
     if (topDocument.hasHadUserInteraction() && document.quirks().shouldAutoplayForArbitraryUserGesture())

Modified: trunk/Source/WebCore/page/MediaProducer.h (276951 => 276952)


--- trunk/Source/WebCore/page/MediaProducer.h	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebCore/page/MediaProducer.h	2021-05-04 10:04:29 UTC (rev 276952)
@@ -33,8 +33,7 @@
 
 class MediaProducer : public CanMakeWeakPtr<MediaProducer> {
 public:
-    enum MediaState {
-        IsNotPlaying = 0,
+    enum class MediaState {
         IsPlayingAudio = 1 << 0,
         IsPlayingVideo = 1 << 1,
         IsPlayingToExternalDevice = 1 << 2,
@@ -56,17 +55,17 @@
         HasActiveDisplayCaptureDevice = 1 << 18,
         HasMutedDisplayCaptureDevice = 1 << 19,
         HasInterruptedDisplayCaptureDevice = 1 << 20,
-
-        AudioCaptureMask = HasActiveAudioCaptureDevice | HasMutedAudioCaptureDevice | HasInterruptedAudioCaptureDevice,
-        VideoCaptureMask = HasActiveVideoCaptureDevice | HasMutedVideoCaptureDevice | HasInterruptedVideoCaptureDevice,
-        DisplayCaptureMask = HasActiveDisplayCaptureDevice | HasMutedDisplayCaptureDevice | HasInterruptedDisplayCaptureDevice,
-        ActiveCaptureMask = HasActiveAudioCaptureDevice | HasActiveVideoCaptureDevice | HasActiveDisplayCaptureDevice,
-        MutedCaptureMask =  HasMutedAudioCaptureDevice | HasMutedVideoCaptureDevice | HasMutedDisplayCaptureDevice,
-        MediaCaptureMask = AudioCaptureMask | VideoCaptureMask | DisplayCaptureMask,
     };
-    typedef unsigned MediaStateFlags;
+    using MediaStateFlags = OptionSet<MediaState>;
+    static constexpr MediaStateFlags IsNotPlaying = { };
+    static constexpr MediaStateFlags AudioCaptureMask = { MediaState::HasActiveAudioCaptureDevice, MediaState::HasMutedAudioCaptureDevice, MediaState::HasInterruptedAudioCaptureDevice };
+    static constexpr MediaStateFlags VideoCaptureMask = { MediaState::HasActiveVideoCaptureDevice, MediaState::HasMutedVideoCaptureDevice, MediaState::HasInterruptedVideoCaptureDevice };
+    static constexpr MediaStateFlags DisplayCaptureMask = { MediaState::HasActiveDisplayCaptureDevice, MediaState::HasMutedDisplayCaptureDevice, MediaState::HasInterruptedDisplayCaptureDevice };
+    static constexpr MediaStateFlags ActiveCaptureMask = { MediaState::HasActiveAudioCaptureDevice, MediaState::HasActiveVideoCaptureDevice, MediaState::HasActiveDisplayCaptureDevice };
+    static constexpr MediaStateFlags MutedCaptureMask = { MediaState::HasMutedAudioCaptureDevice, MediaState::HasMutedVideoCaptureDevice, MediaState::HasMutedDisplayCaptureDevice };
+    static constexpr MediaStateFlags MediaCaptureMask = { MediaState::HasActiveAudioCaptureDevice, MediaState::HasMutedAudioCaptureDevice, MediaState::HasInterruptedAudioCaptureDevice, MediaState::HasActiveVideoCaptureDevice, MediaState::HasMutedVideoCaptureDevice, MediaState::HasInterruptedVideoCaptureDevice, MediaState::HasActiveDisplayCaptureDevice, MediaState::HasMutedDisplayCaptureDevice, MediaState::HasInterruptedDisplayCaptureDevice };
 
-    static bool isCapturing(MediaStateFlags state) { return (state & ActiveCaptureMask) || (state & MutedCaptureMask); }
+    static bool isCapturing(MediaStateFlags state) { return state.containsAny(ActiveCaptureMask) || state.containsAny(MutedCaptureMask); }
 
     virtual MediaStateFlags mediaState() const = 0;
 
@@ -106,6 +105,33 @@
     >;
 };
 
+template<> struct EnumTraits<WebCore::MediaProducer::MediaState> {
+    using values = EnumValues<
+        WebCore::MediaProducer::MediaState,
+        WebCore::MediaProducer::MediaState::IsPlayingAudio,
+        WebCore::MediaProducer::MediaState::IsPlayingVideo,
+        WebCore::MediaProducer::MediaState::IsPlayingToExternalDevice,
+        WebCore::MediaProducer::MediaState::RequiresPlaybackTargetMonitoring,
+        WebCore::MediaProducer::MediaState::ExternalDeviceAutoPlayCandidate,
+        WebCore::MediaProducer::MediaState::DidPlayToEnd,
+        WebCore::MediaProducer::MediaState::IsSourceElementPlaying,
+        WebCore::MediaProducer::MediaState::IsNextTrackControlEnabled,
+        WebCore::MediaProducer::MediaState::IsPreviousTrackControlEnabled,
+        WebCore::MediaProducer::MediaState::HasPlaybackTargetAvailabilityListener,
+        WebCore::MediaProducer::MediaState::HasAudioOrVideo,
+        WebCore::MediaProducer::MediaState::HasActiveAudioCaptureDevice,
+        WebCore::MediaProducer::MediaState::HasActiveVideoCaptureDevice,
+        WebCore::MediaProducer::MediaState::HasMutedAudioCaptureDevice,
+        WebCore::MediaProducer::MediaState::HasMutedVideoCaptureDevice,
+        WebCore::MediaProducer::MediaState::HasInterruptedAudioCaptureDevice,
+        WebCore::MediaProducer::MediaState::HasInterruptedVideoCaptureDevice,
+        WebCore::MediaProducer::MediaState::HasUserInteractedWithMediaElement,
+        WebCore::MediaProducer::MediaState::HasActiveDisplayCaptureDevice,
+        WebCore::MediaProducer::MediaState::HasMutedDisplayCaptureDevice,
+        WebCore::MediaProducer::MediaState::HasInterruptedDisplayCaptureDevice
+    >;
+};
+
 template<> struct EnumTraits<WebCore::MediaProducer::MutedState> {
     using values = EnumValues<
         WebCore::MediaProducer::MutedState,

Modified: trunk/Source/WebCore/page/Page.cpp (276951 => 276952)


--- trunk/Source/WebCore/page/Page.cpp	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebCore/page/Page.cpp	2021-05-04 10:04:29 UTC (rev 276952)
@@ -2116,9 +2116,9 @@
 
 void Page::updateIsPlayingMedia(uint64_t sourceElementID)
 {
-    MediaProducer::MediaStateFlags state = MediaProducer::IsNotPlaying;
-    forEachDocument([&] (Document& document) {
-        state |= document.mediaState();
+    MediaProducer::MediaStateFlags state;
+    forEachDocument([&](auto& document) {
+        state.add(document.mediaState());
     });
 
     if (state == m_mediaState)

Modified: trunk/Source/WebCore/page/Page.h (276951 => 276952)


--- trunk/Source/WebCore/page/Page.h	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebCore/page/Page.h	2021-05-04 10:04:29 UTC (rev 276952)
@@ -1072,7 +1072,7 @@
     bool m_isClosing { false };
     bool m_isRestoringCachedPage { false };
 
-    MediaProducer::MediaStateFlags m_mediaState { MediaProducer::IsNotPlaying };
+    MediaProducer::MediaStateFlags m_mediaState;
 
 #if ENABLE(VIDEO)
     Timer m_playbackControlsManagerUpdateTimer;

Modified: trunk/Source/WebCore/testing/Internals.cpp (276951 => 276952)


--- trunk/Source/WebCore/testing/Internals.cpp	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebCore/testing/Internals.cpp	2021-05-04 10:04:29 UTC (rev 276952)
@@ -4610,45 +4610,45 @@
     if (!document || !document->page())
         return emptyString();
 
-    WebCore::MediaProducer::MediaStateFlags state = document->page()->mediaState();
+    auto state = document->page()->mediaState();
     StringBuilder string;
-    if (state & MediaProducer::IsPlayingAudio)
+    if (state.containsAny(MediaProducer::MediaState::IsPlayingAudio))
         string.append("IsPlayingAudio,");
-    if (state & MediaProducer::IsPlayingVideo)
+    if (state.containsAny(MediaProducer::MediaState::IsPlayingVideo))
         string.append("IsPlayingVideo,");
-    if (state & MediaProducer::IsPlayingToExternalDevice)
+    if (state.containsAny(MediaProducer::MediaState::IsPlayingToExternalDevice))
         string.append("IsPlayingToExternalDevice,");
-    if (state & MediaProducer::RequiresPlaybackTargetMonitoring)
+    if (state.containsAny(MediaProducer::MediaState::RequiresPlaybackTargetMonitoring))
         string.append("RequiresPlaybackTargetMonitoring,");
-    if (state & MediaProducer::ExternalDeviceAutoPlayCandidate)
+    if (state.containsAny(MediaProducer::MediaState::ExternalDeviceAutoPlayCandidate))
         string.append("ExternalDeviceAutoPlayCandidate,");
-    if (state & MediaProducer::DidPlayToEnd)
+    if (state.containsAny(MediaProducer::MediaState::DidPlayToEnd))
         string.append("DidPlayToEnd,");
-    if (state & MediaProducer::IsSourceElementPlaying)
+    if (state.containsAny(MediaProducer::MediaState::IsSourceElementPlaying))
         string.append("IsSourceElementPlaying,");
 
-    if (state & MediaProducer::IsNextTrackControlEnabled)
+    if (state.containsAny(MediaProducer::MediaState::IsNextTrackControlEnabled))
         string.append("IsNextTrackControlEnabled,");
-    if (state & MediaProducer::IsPreviousTrackControlEnabled)
+    if (state.containsAny(MediaProducer::MediaState::IsPreviousTrackControlEnabled))
         string.append("IsPreviousTrackControlEnabled,");
 
-    if (state & MediaProducer::HasPlaybackTargetAvailabilityListener)
+    if (state.containsAny(MediaProducer::MediaState::HasPlaybackTargetAvailabilityListener))
         string.append("HasPlaybackTargetAvailabilityListener,");
-    if (state & MediaProducer::HasAudioOrVideo)
+    if (state.containsAny(MediaProducer::MediaState::HasAudioOrVideo))
         string.append("HasAudioOrVideo,");
-    if (state & MediaProducer::HasActiveAudioCaptureDevice)
+    if (state.containsAny(MediaProducer::MediaState::HasActiveAudioCaptureDevice))
         string.append("HasActiveAudioCaptureDevice,");
-    if (state & MediaProducer::HasActiveVideoCaptureDevice)
+    if (state.containsAny(MediaProducer::MediaState::HasActiveVideoCaptureDevice))
         string.append("HasActiveVideoCaptureDevice,");
-    if (state & MediaProducer::HasMutedAudioCaptureDevice)
+    if (state.containsAny(MediaProducer::MediaState::HasMutedAudioCaptureDevice))
         string.append("HasMutedAudioCaptureDevice,");
-    if (state & MediaProducer::HasMutedVideoCaptureDevice)
+    if (state.containsAny(MediaProducer::MediaState::HasMutedVideoCaptureDevice))
         string.append("HasMutedVideoCaptureDevice,");
-    if (state & MediaProducer::HasUserInteractedWithMediaElement)
+    if (state.containsAny(MediaProducer::MediaState::HasUserInteractedWithMediaElement))
         string.append("HasUserInteractedWithMediaElement,");
-    if (state & MediaProducer::HasActiveDisplayCaptureDevice)
+    if (state.containsAny(MediaProducer::MediaState::HasActiveDisplayCaptureDevice))
         string.append("HasActiveDisplayCaptureDevice,");
-    if (state & MediaProducer::HasMutedDisplayCaptureDevice)
+    if (state.containsAny(MediaProducer::MediaState::HasMutedDisplayCaptureDevice))
         string.append("HasMutedDisplayCaptureDevice,");
 
     if (string.isEmpty())

Modified: trunk/Source/WebKit/ChangeLog (276951 => 276952)


--- trunk/Source/WebKit/ChangeLog	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebKit/ChangeLog	2021-05-04 10:04:29 UTC (rev 276952)
@@ -1,3 +1,32 @@
+2021-05-04  Youenn Fablet  <you...@apple.com>
+
+        Use OptionSet for MediaProducer::MediaStateFlags
+        https://bugs.webkit.org/show_bug.cgi?id=225227
+
+        Reviewed by Eric Carlson.
+
+        Update code according safer MediaProducer::MediaStateFlags type.
+
+        * UIProcess/API/C/WKPage.cpp:
+        (WKPageGetMediaState):
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView cameraCaptureState]):
+        (-[WKWebView microphoneCaptureState]):
+        * UIProcess/Cocoa/MediaUtilities.mm:
+        (WebKit::toWKMediaCaptureStateDeprecated):
+        * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
+        (WebKit::UserMediaPermissionRequestManagerProxy::captureStateChanged):
+        * UIProcess/UserMediaPermissionRequestManagerProxy.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::updateActivityState):
+        (WebKit::WebPageProxy::setMuted):
+        (WebKit::WebPageProxy::updatePlayingMediaDidChange):
+        (WebKit::WebPageProxy::updateReportedMediaCaptureState):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.messages.in:
+        * WebProcess/Plugins/PluginView.h:
+        (WebKit::PluginView::mediaState const):
+
 2021-05-03  Megan Gardner  <megan_gard...@apple.com>
 
         Allow AppHighlight visibility to be toggled

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


--- trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp	2021-05-04 10:04:29 UTC (rev 276952)
@@ -2862,21 +2862,21 @@
     WebCore::MediaProducer::MediaStateFlags coreState = toImpl(page)->reportedMediaState();
     WKMediaState state = kWKMediaIsNotPlaying;
 
-    if (coreState & WebCore::MediaProducer::IsPlayingAudio)
+    if (coreState & WebCore::MediaProducer::MediaState::IsPlayingAudio)
         state |= kWKMediaIsPlayingAudio;
-    if (coreState & WebCore::MediaProducer::IsPlayingVideo)
+    if (coreState & WebCore::MediaProducer::MediaState::IsPlayingVideo)
         state |= kWKMediaIsPlayingVideo;
-    if (coreState & WebCore::MediaProducer::HasActiveAudioCaptureDevice)
+    if (coreState & WebCore::MediaProducer::MediaState::HasActiveAudioCaptureDevice)
         state |= kWKMediaHasActiveAudioCaptureDevice;
-    if (coreState & WebCore::MediaProducer::HasActiveVideoCaptureDevice)
+    if (coreState & WebCore::MediaProducer::MediaState::HasActiveVideoCaptureDevice)
         state |= kWKMediaHasActiveVideoCaptureDevice;
-    if (coreState & WebCore::MediaProducer::HasMutedAudioCaptureDevice)
+    if (coreState & WebCore::MediaProducer::MediaState::HasMutedAudioCaptureDevice)
         state |= kWKMediaHasMutedAudioCaptureDevice;
-    if (coreState & WebCore::MediaProducer::HasMutedVideoCaptureDevice)
+    if (coreState & WebCore::MediaProducer::MediaState::HasMutedVideoCaptureDevice)
         state |= kWKMediaHasMutedVideoCaptureDevice;
-    if (coreState & WebCore::MediaProducer::HasActiveDisplayCaptureDevice)
+    if (coreState & WebCore::MediaProducer::MediaState::HasActiveDisplayCaptureDevice)
         state |= kWKMediaHasActiveDisplayCaptureDevice;
-    if (coreState & WebCore::MediaProducer::HasMutedDisplayCaptureDevice)
+    if (coreState & WebCore::MediaProducer::MediaState::HasMutedDisplayCaptureDevice)
         state |= kWKMediaHasMutedDisplayCaptureDevice;
 
     return state;

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


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2021-05-04 10:04:29 UTC (rev 276952)
@@ -986,9 +986,9 @@
 - (WKMediaCaptureState)cameraCaptureState
 {
     auto state = _page->reportedMediaState();
-    if (state & WebCore::MediaProducer::HasActiveVideoCaptureDevice)
+    if (state & WebCore::MediaProducer::MediaState::HasActiveVideoCaptureDevice)
         return WKMediaCaptureStateActive;
-    if (state & WebCore::MediaProducer::HasMutedVideoCaptureDevice)
+    if (state & WebCore::MediaProducer::MediaState::HasMutedVideoCaptureDevice)
         return WKMediaCaptureStateMuted;
     return WKMediaCaptureStateNone;
 }
@@ -996,9 +996,9 @@
 - (WKMediaCaptureState)microphoneCaptureState
 {
     auto state = _page->reportedMediaState();
-    if (state & WebCore::MediaProducer::HasActiveAudioCaptureDevice)
+    if (state & WebCore::MediaProducer::MediaState::HasActiveAudioCaptureDevice)
         return WKMediaCaptureStateActive;
-    if (state & WebCore::MediaProducer::HasMutedAudioCaptureDevice)
+    if (state & WebCore::MediaProducer::MediaState::HasMutedAudioCaptureDevice)
         return WKMediaCaptureStateMuted;
     return WKMediaCaptureStateNone;
 }

Modified: trunk/Source/WebKit/UIProcess/Cocoa/MediaUtilities.mm (276951 => 276952)


--- trunk/Source/WebKit/UIProcess/Cocoa/MediaUtilities.mm	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebKit/UIProcess/Cocoa/MediaUtilities.mm	2021-05-04 10:04:29 UTC (rev 276952)
@@ -31,13 +31,13 @@
 _WKMediaCaptureStateDeprecated toWKMediaCaptureStateDeprecated(WebCore::MediaProducer::MediaStateFlags state)
 {
     _WKMediaCaptureStateDeprecated mediaCaptureState = _WKMediaCaptureStateDeprecatedNone;
-    if (state & WebCore::MediaProducer::HasActiveAudioCaptureDevice)
+    if (state & WebCore::MediaProducer::MediaState::HasActiveAudioCaptureDevice)
         mediaCaptureState |= _WKMediaCaptureStateDeprecatedActiveMicrophone;
-    if (state & WebCore::MediaProducer::HasActiveVideoCaptureDevice)
+    if (state & WebCore::MediaProducer::MediaState::HasActiveVideoCaptureDevice)
         mediaCaptureState |= _WKMediaCaptureStateDeprecatedActiveCamera;
-    if (state & WebCore::MediaProducer::HasMutedAudioCaptureDevice)
+    if (state & WebCore::MediaProducer::MediaState::HasMutedAudioCaptureDevice)
         mediaCaptureState |= _WKMediaCaptureStateDeprecatedMutedMicrophone;
-    if (state & WebCore::MediaProducer::HasMutedVideoCaptureDevice)
+    if (state & WebCore::MediaProducer::MediaState::HasMutedVideoCaptureDevice)
         mediaCaptureState |= _WKMediaCaptureStateDeprecatedMutedCamera;
 
     return mediaCaptureState;

Modified: trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp (276951 => 276952)


--- trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp	2021-05-04 10:04:29 UTC (rev 276952)
@@ -49,7 +49,7 @@
 using namespace WebCore;
 
 #if ENABLE(MEDIA_STREAM)
-static const MediaProducer::MediaStateFlags activeCaptureMask = MediaProducer::HasActiveAudioCaptureDevice | MediaProducer::HasActiveVideoCaptureDevice;
+static const MediaProducer::MediaStateFlags activeCaptureMask { MediaProducer::MediaState::HasActiveAudioCaptureDevice, MediaProducer::MediaState::HasActiveVideoCaptureDevice };
 
 static uint64_t generateRequestID()
 {
@@ -878,7 +878,7 @@
     if (m_captureState == (newState & activeCaptureMask))
         return;
 
-    ALWAYS_LOG(LOGIDENTIFIER, "state was: ", m_captureState, ", is now: ", newState & activeCaptureMask);
+    ALWAYS_LOG(LOGIDENTIFIER, "state was: ", m_captureState.toRaw(), ", is now: ", (newState & activeCaptureMask).toRaw());
     m_captureState = newState & activeCaptureMask;
 
     Seconds interval;

Modified: trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h (276951 => 276952)


--- trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h	2021-05-04 10:04:29 UTC (rev 276952)
@@ -164,7 +164,7 @@
 
     Vector<DeniedRequest> m_deniedRequests;
 
-    WebCore::MediaProducer::MediaStateFlags m_captureState { WebCore::MediaProducer::IsNotPlaying };
+    WebCore::MediaProducer::MediaStateFlags m_captureState;
     RunLoop::Timer<UserMediaPermissionRequestManagerProxy> m_watchdogTimer;
     Seconds m_currentWatchdogInterval;
 #if !RELEASE_LOG_DISABLED

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (276951 => 276952)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2021-05-04 10:04:29 UTC (rev 276952)
@@ -1990,11 +1990,11 @@
         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.contains(MediaProducer::MutedState::AudioIsMuted)))
+    if (flagsToUpdate & ActivityState::IsAudible && m_mediaState.contains(MediaProducer::MediaState::IsPlayingAudio) && !(m_mutedState.contains(MediaProducer::MutedState::AudioIsMuted)))
         m_activityState.add(ActivityState::IsAudible);
     if (flagsToUpdate & ActivityState::IsLoading && m_pageLoadState.isLoading())
         m_activityState.add(ActivityState::IsLoading);
-    if (flagsToUpdate & ActivityState::IsCapturingMedia && m_mediaState & (MediaProducer::HasActiveAudioCaptureDevice | MediaProducer::HasActiveVideoCaptureDevice))
+    if (flagsToUpdate & ActivityState::IsCapturingMedia && m_mediaState.containsAny({ MediaProducer::MediaState::HasActiveAudioCaptureDevice,  MediaProducer::MediaState::HasActiveVideoCaptureDevice }))
         m_activityState.add(ActivityState::IsCapturingMedia);
 }
 
@@ -6011,8 +6011,8 @@
         return completionHandler();
 
 #if ENABLE(MEDIA_STREAM)
-    bool hasMutedCaptureStreams = m_mediaState & WebCore::MediaProducer::MutedCaptureMask;
-    if (hasMutedCaptureStreams && !(state & WebCore::MediaProducer::MediaStreamCaptureIsMuted))
+    bool hasMutedCaptureStreams = m_mediaState.containsAny(WebCore::MediaProducer::MutedCaptureMask);
+    if (hasMutedCaptureStreams && !(state.containsAny(WebCore::MediaProducer::MediaStreamCaptureIsMuted)))
         WebProcessProxy::muteCaptureInPagesExcept(m_webPageID);
 #endif
 
@@ -9194,10 +9194,10 @@
     WebCore::MediaProducer::MediaStateFlags newMediaCaptureState = newState & WebCore::MediaProducer::MediaCaptureMask;
 #endif
 
-    MediaProducer::MediaStateFlags playingMediaMask = MediaProducer::IsPlayingAudio | MediaProducer::IsPlayingVideo;
+    MediaProducer::MediaStateFlags playingMediaMask { MediaProducer::MediaState::IsPlayingAudio, MediaProducer::MediaState::IsPlayingVideo };
     MediaProducer::MediaStateFlags oldState = m_mediaState;
 
-    bool playingAudioChanges = (oldState & MediaProducer::IsPlayingAudio) != (newState & MediaProducer::IsPlayingAudio);
+    bool playingAudioChanges = (oldState.contains(MediaProducer::MediaState::IsPlayingAudio)) != (newState.contains(MediaProducer::MediaState::IsPlayingAudio));
     if (playingAudioChanges)
         pageClient().isPlayingAudioWillChange();
     m_mediaState = newState;
@@ -9217,11 +9217,11 @@
 
     activityStateDidChange({ ActivityState::IsAudible, ActivityState::IsCapturingMedia });
 
-    playingMediaMask |= WebCore::MediaProducer::MediaCaptureMask;
+    playingMediaMask.add(WebCore::MediaProducer::MediaCaptureMask);
     if ((oldState & playingMediaMask) != (m_mediaState & playingMediaMask))
         m_uiClient->isPlayingMediaDidChange(*this);
 
-    if ((oldState & MediaProducer::HasAudioOrVideo) != (m_mediaState & MediaProducer::HasAudioOrVideo))
+    if ((oldState.containsAny(MediaProducer::MediaState::HasAudioOrVideo)) != (m_mediaState.containsAny(MediaProducer::MediaState::HasAudioOrVideo)))
         videoControlsManagerDidChange();
 
     m_process->updateAudibleMediaAssertions();
@@ -9233,8 +9233,8 @@
     if (m_reportedMediaCaptureState == activeCaptureState)
         return;
 
-    bool haveReportedCapture = m_reportedMediaCaptureState & MediaProducer::MediaCaptureMask;
-    bool willReportCapture = activeCaptureState;
+    bool haveReportedCapture = m_reportedMediaCaptureState.containsAny(MediaProducer::MediaCaptureMask);
+    bool willReportCapture = !activeCaptureState.isEmpty();
 
     if (haveReportedCapture && !willReportCapture && m_updateReportedMediaCaptureStateTimer.isActive())
         return;
@@ -9242,7 +9242,7 @@
     if (!haveReportedCapture && willReportCapture)
         m_updateReportedMediaCaptureStateTimer.startOneShot(m_mediaCaptureReportingDelay);
 
-    RELEASE_LOG_IF_ALLOWED(WebRTC, "updateReportedMediaCaptureState: from %d to %d", m_reportedMediaCaptureState, activeCaptureState);
+    RELEASE_LOG_IF_ALLOWED(WebRTC, "updateReportedMediaCaptureState: from %d to %d", m_reportedMediaCaptureState.toRaw(), activeCaptureState.toRaw());
 
     bool microphoneCaptureChanged = (m_reportedMediaCaptureState & MediaProducer::AudioCaptureMask) != (activeCaptureState & MediaProducer::AudioCaptureMask);
     bool cameraCaptureChanged = (m_reportedMediaCaptureState & MediaProducer::VideoCaptureMask) != (activeCaptureState & MediaProducer::VideoCaptureMask);

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (276951 => 276952)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2021-05-04 10:04:29 UTC (rev 276952)
@@ -1477,17 +1477,17 @@
 
     bool isShowingNavigationGestureSnapshot() const { return m_isShowingNavigationGestureSnapshot; }
 
-    bool isPlayingAudio() const { return !!(m_mediaState & WebCore::MediaProducer::IsPlayingAudio); }
+    bool isPlayingAudio() const { return !!(m_mediaState & WebCore::MediaProducer::MediaState::IsPlayingAudio); }
     void isPlayingMediaDidChange(WebCore::MediaProducer::MediaStateFlags, uint64_t);
     void updateReportedMediaCaptureState();
 
     enum class CanDelayNotification { No, Yes };
     void updatePlayingMediaDidChange(WebCore::MediaProducer::MediaStateFlags, CanDelayNotification = CanDelayNotification::No);
-    bool isCapturingAudio() const { return m_mediaState & WebCore::MediaProducer::AudioCaptureMask; }
-    bool isCapturingVideo() const { return m_mediaState & WebCore::MediaProducer::VideoCaptureMask; }
-    bool hasActiveAudioStream() const { return m_mediaState & WebCore::MediaProducer::HasActiveAudioCaptureDevice; }
-    bool hasActiveVideoStream() const { return m_mediaState & WebCore::MediaProducer::HasActiveVideoCaptureDevice; }
-    WebCore::MediaProducer::MediaStateFlags reportedMediaState() const { return m_reportedMediaCaptureState | (m_mediaState & ~WebCore::MediaProducer::MediaCaptureMask); }
+    bool isCapturingAudio() const { return m_mediaState.containsAny(WebCore::MediaProducer::AudioCaptureMask); }
+    bool isCapturingVideo() const { return m_mediaState.containsAny(WebCore::MediaProducer::VideoCaptureMask); }
+    bool hasActiveAudioStream() const { return m_mediaState.containsAny(WebCore::MediaProducer::MediaState::HasActiveAudioCaptureDevice); }
+    bool hasActiveVideoStream() const { return m_mediaState.containsAny(WebCore::MediaProducer::MediaState::HasActiveVideoCaptureDevice); }
+    WebCore::MediaProducer::MediaStateFlags reportedMediaState() const { return m_reportedMediaCaptureState | (m_mediaState - WebCore::MediaProducer::MediaCaptureMask); }
     WebCore::MediaProducer::MutedStateFlags mutedStateFlags() const { return m_mutedState; }
 
     void handleAutoplayEvent(WebCore::AutoplayEvent, OptionSet<WebCore::AutoplayEventFlags>);
@@ -2863,10 +2863,10 @@
     bool m_activityStateChangeWantsSynchronousReply { false };
     Vector<CompletionHandler<void()>> m_nextActivityStateChangeCallbacks;
 
-    WebCore::MediaProducer::MediaStateFlags m_mediaState { WebCore::MediaProducer::IsNotPlaying };
+    WebCore::MediaProducer::MediaStateFlags m_mediaState;
 
     // To make sure capture indicators are visible long enough, m_reportedMediaCaptureState is the same as m_mediaState except that we might delay a bit transition from capturing to not-capturing.
-    WebCore::MediaProducer::MediaStateFlags m_reportedMediaCaptureState { WebCore::MediaProducer::IsNotPlaying };
+    WebCore::MediaProducer::MediaStateFlags m_reportedMediaCaptureState;
     RunLoop::Timer<WebPageProxy> m_updateReportedMediaCaptureStateTimer;
     static constexpr Seconds DefaultMediaCaptureReportingDelay { 3_s };
     Seconds m_mediaCaptureReportingDelay { DefaultMediaCaptureReportingDelay };

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in (276951 => 276952)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in	2021-05-04 10:04:29 UTC (rev 276952)
@@ -462,7 +462,7 @@
     ContentFilterDidBlockLoadForFrame(WebCore::ContentFilterUnblockHandler unblockHandler, WebCore::FrameIdentifier frameID)
 #endif
 
-    IsPlayingMediaDidChange(unsigned state, uint64_t sourceElementID)
+    IsPlayingMediaDidChange(WebCore::MediaProducer::MediaStateFlags state, uint64_t sourceElementID)
     HandleAutoplayEvent(enum:uint8_t WebCore::AutoplayEvent event, OptionSet<WebCore::AutoplayEventFlags> flags)
 
 #if PLATFORM(MAC)
@@ -481,7 +481,7 @@
     AddPlaybackTargetPickerClient(WebCore::PlaybackTargetClientContextIdentifier contextId)
     RemovePlaybackTargetPickerClient(WebCore::PlaybackTargetClientContextIdentifier contextId)
     ShowPlaybackTargetPicker(WebCore::PlaybackTargetClientContextIdentifier contextId, WebCore::FloatRect pickerLocation, bool hasVideo)
-    PlaybackTargetPickerClientStateDidChange(WebCore::PlaybackTargetClientContextIdentifier contextId, unsigned mediaState)
+    PlaybackTargetPickerClientStateDidChange(WebCore::PlaybackTargetClientContextIdentifier contextId, WebCore::MediaProducer::MediaStateFlags mediaState)
     SetMockMediaPlaybackTargetPickerEnabled(bool enabled)
     SetMockMediaPlaybackTargetPickerState(String name, enum:uint8_t WebCore::MediaPlaybackTargetContext::MockState pickerState)
     MockMediaPlaybackTargetPickerDismissPopup()

Modified: trunk/Source/WebKit/WebProcess/Plugins/PluginView.h (276951 => 276952)


--- trunk/Source/WebKit/WebProcess/Plugins/PluginView.h	2021-05-04 08:00:03 UTC (rev 276951)
+++ trunk/Source/WebKit/WebProcess/Plugins/PluginView.h	2021-05-04 10:04:29 UTC (rev 276952)
@@ -185,7 +185,7 @@
     void mediaCanStart(WebCore::Document&) override;
 
     // WebCore::MediaProducer
-    MediaProducer::MediaStateFlags mediaState() const override { return m_pluginIsPlayingAudio ? MediaProducer::IsPlayingAudio : MediaProducer::IsNotPlaying; }
+    WebCore::MediaProducer::MediaStateFlags mediaState() const override;
     void pageMutedStateDidChange() override;
 
     // PluginController
@@ -275,4 +275,12 @@
     bool m_pluginIsPlayingAudio { false };
 };
 
+inline WebCore::MediaProducer::MediaStateFlags PluginView::mediaState() const
+{
+    WebCore::MediaProducer::MediaStateFlags mediaState;
+    if (m_pluginIsPlayingAudio)
+        mediaState.add(MediaProducer::MediaState::IsPlayingAudio);
+    return mediaState;
+}
+
 } // namespace WebKit
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to