Diff
Modified: trunk/Source/WebCore/ChangeLog (276891 => 276892)
--- trunk/Source/WebCore/ChangeLog 2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebCore/ChangeLog 2021-05-03 08:12:49 UTC (rev 276892)
@@ -1,3 +1,24 @@
+2021-05-03 Youenn Fablet <[email protected]>
+
+ Use OptionSet for MediaProducer::MutedStateFlags
+ https://bugs.webkit.org/show_bug.cgi?id=224550
+ <rdar://problem/76960294>
+
+ Reviewed by Eric Carlson.
+
+ Refactoring to improve type safety.
+ No change of behavior.
+
+ * Modules/mediastream/MediaStreamTrack.cpp:
+ (WebCore::MediaStreamTrack::updateCaptureAccordingToMutedState):
+ (WebCore::MediaStreamTrack::updateToPageMutedState):
+ * page/MediaProducer.h:
+ * page/Page.h:
+ (WebCore::Page::isAudioMuted const):
+ (WebCore::Page::isMediaCaptureMuted const):
+ * testing/Internals.cpp:
+ (WebCore::Internals::setPageMuted):
+
2021-05-02 Rob Buis <[email protected]>
getPropertyValue for url path doesn't return the "#" character
Modified: trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp (276891 => 276892)
--- trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp 2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp 2021-05-03 08:12:49 UTC (rev 276892)
@@ -483,13 +483,13 @@
auto* activeAudioSource = RealtimeMediaSourceCenter::singleton().audioCaptureFactory().activeSource();
if (activeAudioSource && isSourceCapturingForTrackInDocument(*activeAudioSource, document)) {
- bool pageMuted = page->mutedState() & MediaProducer::AudioCaptureIsMuted;
+ bool pageMuted = page->mutedState().contains(MediaProducer::MutedState::AudioCaptureIsMuted);
activeAudioSource->setMuted(pageMuted || (document.hidden() && document.settings().interruptAudioOnPageVisibilityChangeEnabled()));
}
auto* activeVideoSource = RealtimeMediaSourceCenter::singleton().videoCaptureFactory().activeSource();
if (activeVideoSource && isSourceCapturingForTrackInDocument(*activeVideoSource, document)) {
- bool pageMuted = page->mutedState() & MediaProducer::VideoCaptureIsMuted;
+ bool pageMuted = page->mutedState().contains(MediaProducer::MutedState::VideoCaptureIsMuted);
activeVideoSource->setMuted(pageMuted || document.hidden());
}
#else
@@ -509,14 +509,14 @@
switch (source().deviceType()) {
case CaptureDevice::DeviceType::Microphone:
- m_private->setMuted(page->mutedState() & MediaProducer::AudioCaptureIsMuted);
+ m_private->setMuted(page->mutedState().contains(MediaProducer::MutedState::AudioCaptureIsMuted));
break;
case CaptureDevice::DeviceType::Camera:
- m_private->setMuted(page->mutedState() & MediaProducer::VideoCaptureIsMuted);
+ m_private->setMuted(page->mutedState().contains(MediaProducer::MutedState::VideoCaptureIsMuted));
break;
case CaptureDevice::DeviceType::Screen:
case CaptureDevice::DeviceType::Window:
- m_private->setMuted(page->mutedState() & MediaProducer::ScreenCaptureIsMuted);
+ m_private->setMuted(page->mutedState().contains(MediaProducer::MutedState::ScreenCaptureIsMuted));
break;
case CaptureDevice::DeviceType::Speaker:
case CaptureDevice::DeviceType::Unknown:
Modified: trunk/Source/WebCore/page/MediaProducer.h (276891 => 276892)
--- trunk/Source/WebCore/page/MediaProducer.h 2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebCore/page/MediaProducer.h 2021-05-03 08:12:49 UTC (rev 276892)
@@ -26,6 +26,7 @@
#pragma once
#include <wtf/EnumTraits.h>
+#include <wtf/OptionSet.h>
#include <wtf/WeakPtr.h>
namespace WebCore {
@@ -75,18 +76,17 @@
AudioVideo
};
- enum MutedState {
- NoneMuted = 0,
+ enum class MutedState {
AudioIsMuted = 1 << 0,
AudioCaptureIsMuted = 1 << 1,
VideoCaptureIsMuted = 1 << 2,
ScreenCaptureIsMuted = 1 << 3,
-
- AudioAndVideoCaptureIsMuted = AudioCaptureIsMuted | VideoCaptureIsMuted,
- MediaStreamCaptureIsMuted = AudioCaptureIsMuted | VideoCaptureIsMuted | ScreenCaptureIsMuted,
};
- typedef unsigned MutedStateFlags;
+ using MutedStateFlags = OptionSet<MutedState>;
+ static constexpr MutedStateFlags AudioAndVideoCaptureIsMuted = { MutedState::AudioCaptureIsMuted, MutedState::VideoCaptureIsMuted };
+ static constexpr MutedStateFlags MediaStreamCaptureIsMuted = { MutedState::AudioCaptureIsMuted, MutedState::VideoCaptureIsMuted, MutedState::ScreenCaptureIsMuted };
+
virtual void pageMutedStateDidChange() = 0;
protected:
@@ -106,4 +106,14 @@
>;
};
+template<> struct EnumTraits<WebCore::MediaProducer::MutedState> {
+ using values = EnumValues<
+ WebCore::MediaProducer::MutedState,
+ WebCore::MediaProducer::MutedState::AudioIsMuted,
+ WebCore::MediaProducer::MutedState::AudioCaptureIsMuted,
+ WebCore::MediaProducer::MutedState::VideoCaptureIsMuted,
+ WebCore::MediaProducer::MutedState::ScreenCaptureIsMuted
+ >;
+};
+
}
Modified: trunk/Source/WebCore/page/Page.h (276891 => 276892)
--- trunk/Source/WebCore/page/Page.h 2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebCore/page/Page.h 2021-05-03 08:12:49 UTC (rev 276892)
@@ -699,8 +699,8 @@
MediaProducer::MediaStateFlags mediaState() const { return m_mediaState; }
void updateIsPlayingMedia(uint64_t);
MediaProducer::MutedStateFlags mutedState() const { return m_mutedState; }
- bool isAudioMuted() const { return m_mutedState & MediaProducer::AudioIsMuted; }
- bool isMediaCaptureMuted() const { return m_mutedState & MediaProducer::MediaStreamCaptureIsMuted; };
+ bool isAudioMuted() const { return m_mutedState.contains(MediaProducer::MutedState::AudioIsMuted); }
+ bool isMediaCaptureMuted() const { return m_mutedState.containsAny(MediaProducer::MediaStreamCaptureIsMuted); };
void schedulePlaybackControlsManagerUpdate();
#if ENABLE(VIDEO)
void playbackControlsMediaEngineChanged();
@@ -953,7 +953,7 @@
bool m_inLowQualityInterpolationMode { false };
bool m_areMemoryCacheClientCallsEnabled { true };
float m_mediaVolume { 1 };
- MediaProducer::MutedStateFlags m_mutedState { MediaProducer::NoneMuted };
+ MediaProducer::MutedStateFlags m_mutedState;
float m_pageScaleFactor { 1 };
float m_zoomedOutPageScaleFactor { 0 };
Modified: trunk/Source/WebCore/testing/Internals.cpp (276891 => 276892)
--- trunk/Source/WebCore/testing/Internals.cpp 2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebCore/testing/Internals.cpp 2021-05-03 08:12:49 UTC (rev 276892)
@@ -4590,14 +4590,14 @@
if (!document)
return;
- WebCore::MediaProducer::MutedStateFlags state = MediaProducer::NoneMuted;
+ WebCore::MediaProducer::MutedStateFlags state;
for (StringView stateString : statesString.split(',')) {
if (equalLettersIgnoringASCIICase(stateString, "audio"))
- state |= MediaProducer::AudioIsMuted;
+ state.add(MediaProducer::MutedState::AudioIsMuted);
if (equalLettersIgnoringASCIICase(stateString, "capturedevices"))
- state |= MediaProducer::AudioAndVideoCaptureIsMuted;
+ state.add(MediaProducer::AudioAndVideoCaptureIsMuted);
if (equalLettersIgnoringASCIICase(stateString, "screencapture"))
- state |= MediaProducer::ScreenCaptureIsMuted;
+ state.add(MediaProducer::MutedState::ScreenCaptureIsMuted);
}
if (Page* page = document->page())
Modified: trunk/Source/WebKit/ChangeLog (276891 => 276892)
--- trunk/Source/WebKit/ChangeLog 2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/ChangeLog 2021-05-03 08:12:49 UTC (rev 276892)
@@ -1,3 +1,30 @@
+2021-05-03 Youenn Fablet <[email protected]>
+
+ Use OptionSet for MediaProducer::MutedStateFlags
+ https://bugs.webkit.org/show_bug.cgi?id=224550
+ <rdar://problem/76960294>
+
+ Reviewed by Eric Carlson.
+
+ Update to use new OptionSet MediaProducer::MutedStateFlags.
+ Fix a potential bug in case the page is video capture muted, covered by updated API test.
+
+ * Shared/WebPageCreationParameters.cpp:
+ (WebKit::WebPageCreationParameters::decode):
+ * UIProcess/API/C/WKPage.cpp:
+ (WKPageSetMuted):
+ * UIProcess/API/Cocoa/WKWebView.mm:
+ (-[WKWebView setMicrophoneCaptureState:completionHandler:]):
+ (-[WKWebView setCameraCaptureState:completionHandler:]):
+ (-[WKWebView _setPageMuted:]):
+ * UIProcess/API/glib/WebKitWebView.cpp:
+ (webkit_web_view_set_is_muted):
+ * UIProcess/Cocoa/MediaUtilities.mm:
+ (WebKit::toWKMediaMutedState):
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::updateActivityState):
+ * UIProcess/WebPageProxy.h:
+
2021-05-03 Kimmo Kinnunen <[email protected]>
IPC::Semaphore operations ASSERT when the semaphore has been destroyed
Modified: trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp (276891 => 276892)
--- trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp 2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp 2021-05-03 08:12:49 UTC (rev 276892)
@@ -275,8 +275,13 @@
return WTF::nullopt;
if (!decoder.decode(parameters.mediaVolume))
return WTF::nullopt;
- if (!decoder.decode(parameters.muted))
+
+ Optional<MediaProducer::MutedStateFlags> mutedStateFlags;
+ decoder >> mutedStateFlags;
+ if (!mutedStateFlags)
return WTF::nullopt;
+ parameters.muted = *mutedStateFlags;
+
if (!decoder.decode(parameters.mayStartMediaWhenInWindow))
return WTF::nullopt;
if (!decoder.decode(parameters.mediaPlaybackIsSuspended))
Modified: trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp (276891 => 276892)
--- trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp 2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp 2021-05-03 08:12:49 UTC (rev 276892)
@@ -2712,14 +2712,14 @@
void WKPageSetMuted(WKPageRef page, WKMediaMutedState mutedState)
{
- WebCore::MediaProducer::MutedStateFlags coreState = WebCore::MediaProducer::NoneMuted;
+ WebCore::MediaProducer::MutedStateFlags coreState;
if (mutedState & kWKMediaAudioMuted)
- coreState |= WebCore::MediaProducer::AudioIsMuted;
+ coreState.add(WebCore::MediaProducer::MutedState::AudioIsMuted);
if (mutedState & kWKMediaCaptureDevicesMuted)
- coreState |= WebCore::MediaProducer::AudioAndVideoCaptureIsMuted;
+ coreState.add(WebCore::MediaProducer::AudioAndVideoCaptureIsMuted);
if (mutedState & kWKMediaScreenCaptureMuted)
- coreState |= WebCore::MediaProducer::ScreenCaptureIsMuted;
+ coreState.add(WebCore::MediaProducer::MutedState::ScreenCaptureIsMuted);
toImpl(page)->setMuted(coreState);
}
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (276891 => 276892)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm 2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm 2021-05-03 08:12:49 UTC (rev 276892)
@@ -1015,10 +1015,10 @@
return;
}
auto mutedState = _page->mutedStateFlags();
- if (state == WKMediaCaptureStateActive && mutedState & WebCore::MediaProducer::AudioCaptureIsMuted)
- mutedState ^= WebCore::MediaProducer::AudioCaptureIsMuted;
+ if (state == WKMediaCaptureStateActive)
+ mutedState.remove(WebCore::MediaProducer::MutedState::AudioCaptureIsMuted);
else if (state == WKMediaCaptureStateMuted)
- mutedState = WebCore::MediaProducer::AudioCaptureIsMuted;
+ mutedState.add(WebCore::MediaProducer::MutedState::AudioCaptureIsMuted);
_page->setMuted(mutedState, [completionHandler = makeBlockPtr(completionHandler)] {
completionHandler();
});
@@ -1036,10 +1036,10 @@
return;
}
auto mutedState = _page->mutedStateFlags();
- if (state == WKMediaCaptureStateActive && mutedState & WebCore::MediaProducer::VideoCaptureIsMuted)
- mutedState ^= WebCore::MediaProducer::VideoCaptureIsMuted;
+ if (state == WKMediaCaptureStateActive)
+ mutedState.remove(WebCore::MediaProducer::MutedState::VideoCaptureIsMuted);
else if (state == WKMediaCaptureStateMuted)
- mutedState = WebCore::MediaProducer::VideoCaptureIsMuted;
+ mutedState.add(WebCore::MediaProducer::MutedState::VideoCaptureIsMuted);
_page->setMuted(mutedState, [completionHandler = makeBlockPtr(completionHandler)] {
completionHandler();
});
@@ -3356,14 +3356,14 @@
- (void)_setPageMuted:(_WKMediaMutedState)mutedState
{
- WebCore::MediaProducer::MutedStateFlags coreState = WebCore::MediaProducer::NoneMuted;
+ WebCore::MediaProducer::MutedStateFlags coreState;
if (mutedState & _WKMediaAudioMuted)
- coreState |= WebCore::MediaProducer::AudioIsMuted;
+ coreState.add(WebCore::MediaProducer::MutedState::AudioIsMuted);
if (mutedState & _WKMediaCaptureDevicesMuted)
- coreState |= WebCore::MediaProducer::AudioAndVideoCaptureIsMuted;
+ coreState.add(WebCore::MediaProducer::AudioAndVideoCaptureIsMuted);
if (mutedState & _WKMediaScreenCaptureMuted)
- coreState |= WebCore::MediaProducer::ScreenCaptureIsMuted;
+ coreState.add(WebCore::MediaProducer::MutedState::ScreenCaptureIsMuted);
_page->setMuted(coreState);
}
Modified: trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp (276891 => 276892)
--- trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp 2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp 2021-05-03 08:12:49 UTC (rev 276892)
@@ -3271,7 +3271,10 @@
if (webkit_web_view_get_is_muted (webView) == muted)
return;
- getPage(webView).setMuted(muted ? WebCore::MediaProducer::AudioIsMuted : WebCore::MediaProducer::NoneMuted);
+ WebCore::MediaProducer::MutedStateFlags audioMutedFlag;
+ if (muted)
+ audioMutedFlag.add(WebCore::MediaProducer::MutedState::AudioIsMuted);
+ getPage(webView).setMuted(audioMutedFlag);
g_object_notify_by_pspec(G_OBJECT(webView), sObjProperties[PROP_IS_MUTED]);
}
Modified: trunk/Source/WebKit/UIProcess/Cocoa/MediaUtilities.mm (276891 => 276892)
--- trunk/Source/WebKit/UIProcess/Cocoa/MediaUtilities.mm 2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/UIProcess/Cocoa/MediaUtilities.mm 2021-05-03 08:12:49 UTC (rev 276892)
@@ -46,13 +46,11 @@
_WKMediaMutedState toWKMediaMutedState(WebCore::MediaProducer::MutedStateFlags state)
{
_WKMediaMutedState mediaMutedState = _WKMediaNoneMuted;
- if (state & WebCore::MediaProducer::NoneMuted)
- mediaMutedState |= _WKMediaNoneMuted;
- if (state & WebCore::MediaProducer::AudioIsMuted)
+ if (state & WebCore::MediaProducer::MutedState::AudioIsMuted)
mediaMutedState |= _WKMediaAudioMuted;
if (state & WebCore::MediaProducer::AudioAndVideoCaptureIsMuted)
mediaMutedState |= _WKMediaCaptureDevicesMuted;
- if (state & WebCore::MediaProducer::ScreenCaptureIsMuted)
+ if (state & WebCore::MediaProducer::MutedState::ScreenCaptureIsMuted)
mediaMutedState |= _WKMediaScreenCaptureMuted;
return mediaMutedState;
}
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (276891 => 276892)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2021-05-03 08:12:49 UTC (rev 276892)
@@ -1990,7 +1990,7 @@
m_activityState.add(ActivityState::IsInWindow);
if (flagsToUpdate & ActivityState::IsVisuallyIdle && pageClient().isVisuallyIdle())
m_activityState.add(ActivityState::IsVisuallyIdle);
- if (flagsToUpdate & ActivityState::IsAudible && m_mediaState & MediaProducer::IsPlayingAudio && !(m_mutedState & MediaProducer::AudioIsMuted))
+ if (flagsToUpdate & ActivityState::IsAudible && m_mediaState & MediaProducer::IsPlayingAudio && !(m_mutedState.contains(MediaProducer::MutedState::AudioIsMuted)))
m_activityState.add(ActivityState::IsAudible);
if (flagsToUpdate & ActivityState::IsLoading && m_pageLoadState.isLoading())
m_activityState.add(ActivityState::IsLoading);
@@ -2447,10 +2447,12 @@
void WebPageProxy::setMediaStreamCaptureMuted(bool muted)
{
+ auto state = m_mutedState;
if (muted)
- setMuted(m_mutedState | WebCore::MediaProducer::MediaStreamCaptureIsMuted);
+ state.add(WebCore::MediaProducer::MediaStreamCaptureIsMuted);
else
- setMuted(m_mutedState & ~WebCore::MediaProducer::MediaStreamCaptureIsMuted);
+ state.remove(WebCore::MediaProducer::MediaStreamCaptureIsMuted);
+ setMuted(state);
}
void WebPageProxy::activateMediaStreamCaptureInPage()
@@ -2458,7 +2460,7 @@
#if ENABLE(MEDIA_STREAM)
WebProcessProxy::muteCaptureInPagesExcept(m_webPageID);
#endif
- setMuted(m_mutedState & ~WebCore::MediaProducer::MediaStreamCaptureIsMuted);
+ setMediaStreamCaptureMuted(false);
}
#if !PLATFORM(IOS_FAMILY)
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (276891 => 276892)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.h 2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h 2021-05-03 08:12:49 UTC (rev 276892)
@@ -734,7 +734,7 @@
bool isEditable() const { return m_isEditable; }
void activateMediaStreamCaptureInPage();
- bool isMediaStreamCaptureMuted() const { return m_mutedState & WebCore::MediaProducer::MediaStreamCaptureIsMuted; }
+ bool isMediaStreamCaptureMuted() const { return m_mutedState.containsAny(WebCore::MediaProducer::MediaStreamCaptureIsMuted); }
void setMediaStreamCaptureMuted(bool);
void requestFontAttributesAtSelectionStart(CompletionHandler<void(const WebCore::FontAttributes&)>&&);
@@ -1365,7 +1365,7 @@
void setMediaVolume(float);
void setMuted(WebCore::MediaProducer::MutedStateFlags, CompletionHandler<void()>&& = [] { });
- bool isAudioMuted() const { return m_mutedState & WebCore::MediaProducer::AudioIsMuted; };
+ bool isAudioMuted() const { return m_mutedState.contains(WebCore::MediaProducer::MutedState::AudioIsMuted); };
void setMayStartMediaWhenInWindow(bool);
bool mayStartMediaWhenInWindow() const { return m_mayStartMediaWhenInWindow; }
void setMediaCaptureEnabled(bool);
@@ -2826,7 +2826,7 @@
WebCore::LayoutPoint m_maxStableLayoutViewportOrigin;
float m_mediaVolume { 1 };
- WebCore::MediaProducer::MutedStateFlags m_mutedState { WebCore::MediaProducer::NoneMuted };
+ WebCore::MediaProducer::MutedStateFlags m_mutedState;
bool m_mayStartMediaWhenInWindow { true };
bool m_mediaPlaybackIsSuspended { false };
bool m_mediaCaptureEnabled { true };
Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp (276891 => 276892)
--- trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp 2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp 2021-05-03 08:12:49 UTC (rev 276892)
@@ -1785,7 +1785,7 @@
void WebProcessProxy::pageMutedStateChanged(WebCore::PageIdentifier identifier, WebCore::MediaProducer::MutedStateFlags flags)
{
- bool mutedForCapture = flags & MediaProducer::AudioAndVideoCaptureIsMuted;
+ bool mutedForCapture = flags.containsAny(MediaProducer::AudioAndVideoCaptureIsMuted);
if (!mutedForCapture)
return;
Modified: trunk/Tools/ChangeLog (276891 => 276892)
--- trunk/Tools/ChangeLog 2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Tools/ChangeLog 2021-05-03 08:12:49 UTC (rev 276892)
@@ -1,3 +1,14 @@
+2021-05-03 Youenn Fablet <[email protected]>
+
+ Use OptionSet for MediaProducer::MutedStateFlags
+ https://bugs.webkit.org/show_bug.cgi?id=224550
+ <rdar://problem/76960294>
+
+ Reviewed by Eric Carlson.
+
+ * TestWebKitAPI/Tests/WebKit/GetUserMedia.mm:
+ (TestWebKitAPI::TEST):
+
2021-05-01 Chris Dumez <[email protected]>
Start leveraging std::filesystem in WTF::FileSystem
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit/GetUserMedia.mm (276891 => 276892)
--- trunk/Tools/TestWebKitAPI/Tests/WebKit/GetUserMedia.mm 2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit/GetUserMedia.mm 2021-05-03 08:12:49 UTC (rev 276892)
@@ -280,6 +280,7 @@
[webView stringByEvaluatingJavaScript:@"stop()"];
EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateNone));
+ // Mute camera, then microphone
microphoneCaptureStateChange = false;
cameraCaptureStateChange = false;
[webView stringByEvaluatingJavaScript:@"captureAudioAndVideo()"];
@@ -293,8 +294,8 @@
microphoneCaptureStateChange = false;
[webView setMicrophoneCaptureState:WKMediaCaptureStateMuted completionHandler:nil];
+ EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateMuted));
EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateMuted));
- EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateActive));
microphoneCaptureStateChange = false;
cameraCaptureStateChange = false;
@@ -302,6 +303,34 @@
EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateNone));
EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateNone));
+ // Mute microphone, then camera
+ microphoneCaptureStateChange = false;
+ cameraCaptureStateChange = false;
+ [webView stringByEvaluatingJavaScript:@"captureAudioAndVideo()"];
+ EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateActive));
+ EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateActive));
+
+ microphoneCaptureStateChange = false;
+ [webView setMicrophoneCaptureState:WKMediaCaptureStateMuted completionHandler:nil];
+ EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateMuted));
+ EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateActive));
+
+ cameraCaptureStateChange = false;
+ [webView setCameraCaptureState:WKMediaCaptureStateMuted completionHandler:nil];
+ EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateMuted));
+ EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateMuted));
+
+ // Stop microphone, then stop camera
+ microphoneCaptureStateChange = false;
+ [webView setMicrophoneCaptureState:WKMediaCaptureStateNone completionHandler:nil];
+ EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateNone));
+ EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateMuted));
+
+ cameraCaptureStateChange = false;
+ [webView setCameraCaptureState:WKMediaCaptureStateNone completionHandler:nil];
+ EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateNone));
+ EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateNone));
+
[webView removeObserver:observer.get() forKeyPath:@"microphoneCaptureState"];
[webView removeObserver:observer.get() forKeyPath:@"cameraCaptureState"];
}