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