inspector/page/overrideSetting-MockCaptureDevicesEnabled.html is failing after removal of internals.setMockMediaCaptureDevicesEnabled API
https://bugs.webkit.org/show_bug.cgi?id=204849

Reviewed by Eric Carlson.

Source/WebCore:

Add API and internals to check which center is used in WebProcess.
Covered by updated test.

* platform/mock/MockRealtimeMediaSourceCenter.cpp:
(WebCore::MockRealtimeMediaSourceCenter::setMockRealtimeMediaSourceCenterEnabled):
(WebCore::MockRealtimeMediaSourceCenter::mockRealtimeMediaSourceCenterEnabled):
* platform/mock/MockRealtimeMediaSourceCenter.h:
* testing/Internals.cpp:
(WebCore::Internals::isMockRealtimeMediaSourceCenterEnabled):
* testing/Internals.h:
* testing/Internals.idl:

Source/WebKit:

Synchronize the center with the preferences when the value might be updated.
Add API to check which center is used in UIProcess.

* UIProcess/API/C/WKPage.cpp:
(WKPageIsMockRealtimeMediaSourceCenterEnabled):
* UIProcess/API/C/WKPagePrivate.h:
* UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
(WebKit::UserMediaPermissionRequestManagerProxy::UserMediaPermissionRequestManagerProxy):
(WebKit::UserMediaPermissionRequestManagerProxy::setMockCaptureDevicesEnabledOverride):
* UIProcess/UserMediaPermissionRequestManagerProxy.h:
(WebKit::UserMediaPermissionRequestManagerProxy::setMockCaptureDevicesEnabledOverride): Deleted.

Tools:

Add test runner API to check which center (mock or not) is used in UIProcess side.

* WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
* WebKitTestRunner/InjectedBundle/TestRunner.cpp:
(WTR::TestRunner::isMockRealtimeMediaSourceCenterEnabled):
* WebKitTestRunner/InjectedBundle/TestRunner.h:
* WebKitTestRunner/TestController.cpp:
(WTR::TestController::isMockRealtimeMediaSourceCenterEnabled const):
* WebKitTestRunner/TestController.h:
* WebKitTestRunner/TestInvocation.cpp:
(WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle):

LayoutTests:

Update test to use center state getters.

* inspector/page/overrideSetting-MockCaptureDevicesEnabled-expected.txt:
* inspector/page/overrideSetting-MockCaptureDevicesEnabled.html:


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@253149 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index cf0bff9..0b11b7d 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,15 @@
+2019-12-05  youenn fablet  <youenn@apple.com>
+
+        inspector/page/overrideSetting-MockCaptureDevicesEnabled.html is failing after removal of internals.setMockMediaCaptureDevicesEnabled API
+        https://bugs.webkit.org/show_bug.cgi?id=204849
+
+        Reviewed by Eric Carlson.
+
+        Update test to use center state getters.
+
+        * inspector/page/overrideSetting-MockCaptureDevicesEnabled-expected.txt:
+        * inspector/page/overrideSetting-MockCaptureDevicesEnabled.html:
+
 2019-12-05  Eric Carlson  <eric.carlson@apple.com>
 
         WPT test MediaStream-MediaElement-srcObject.https.html times out
diff --git a/LayoutTests/inspector/page/overrideSetting-MockCaptureDevicesEnabled-expected.txt b/LayoutTests/inspector/page/overrideSetting-MockCaptureDevicesEnabled-expected.txt
index 0f88bf0..2417d90 100644
--- a/LayoutTests/inspector/page/overrideSetting-MockCaptureDevicesEnabled-expected.txt
+++ b/LayoutTests/inspector/page/overrideSetting-MockCaptureDevicesEnabled-expected.txt
@@ -3,9 +3,10 @@
 
 == Running test suite: Page.overrideSetting
 -- Running test case: Page.overrideSetting.MockCaptureDevicesEnabled
-Expected Error: The I/O read operation failed.
+Overriding MockCaptureDevicesEnabled to false...
+Mock use check: PASS
 Overriding MockCaptureDevicesEnabled to true...
-PASS: getUserMedia should not fail when no devices are available
+Mock use check: PASS
 Removing MockCaptureDevicesEnabled override...
-Expected Error: The I/O read operation failed.
+Mock use check: PASS
 
diff --git a/LayoutTests/inspector/page/overrideSetting-MockCaptureDevicesEnabled.html b/LayoutTests/inspector/page/overrideSetting-MockCaptureDevicesEnabled.html
index 4278733..ef0bbbb 100644
--- a/LayoutTests/inspector/page/overrideSetting-MockCaptureDevicesEnabled.html
+++ b/LayoutTests/inspector/page/overrideSetting-MockCaptureDevicesEnabled.html
@@ -4,13 +4,18 @@
 <script src="../../http/tests/inspector/resources/inspector-test.js"></script>
 <script>
 
-if (window.internals)
-    window.internals.setMockMediaCaptureDevicesEnabled(false);
+function checkMockUsage(expectToUseMock)
+{
+    if (window.testRunner && testRunner.isMockRealtimeMediaSourceCenterEnabled && testRunner.isMockRealtimeMediaSourceCenterEnabled() !== expectToUseMock)
+        return "FAIL: testRunner mismatch";
+    if (window.internals && internals.isMockRealtimeMediaSourceCenterEnabled && internals.isMockRealtimeMediaSourceCenterEnabled() !== expectToUseMock)
+        return "FAIL: internals mismatch";
+    return "PASS";
+}
 
-function requestGetUserMedia() {
-    navigator.mediaDevices.getUserMedia({audio: {}, video: {}})
-        .then(() => TestPage.dispatchEventToFrontend("GetUserMedia", {success: true}))
-        .catch((error) => TestPage.dispatchEventToFrontend("GetUserMedia", {error: error.message}));
+function validateMockUsage(expectToUseMock)
+{
+    TestPage.dispatchEventToFrontend("ValidateMock", checkMockUsage(expectToUseMock));
 }
 
 function test()
@@ -21,29 +26,28 @@
         name: "Page.overrideSetting.MockCaptureDevicesEnabled",
         description: "Test that changing whether mock capture devices are enabled has an effect.",
         async test() {
-            let [defaultResult] = await Promise.all([
-                InspectorTest.awaitEvent("GetUserMedia"),
-                InspectorTest.evaluateInPage(`requestGetUserMedia()`),
-            ]);
-            InspectorTest.log("Expected Error: " + defaultResult.data.error);
+            InspectorTest.log("Overriding MockCaptureDevicesEnabled to false...");
+            await PageAgent.overrideSetting(InspectorBackend.Enum.Page.Setting.MockCaptureDevicesEnabled, false);
+
+            InspectorTest.evaluateInPage(`validateMockUsage(false)`);
+            result = await InspectorTest.awaitEvent("ValidateMock");
+            InspectorTest.log("Mock use check: " + result.data);
+
 
             InspectorTest.log("Overriding MockCaptureDevicesEnabled to true...");
             await PageAgent.overrideSetting(InspectorBackend.Enum.Page.Setting.MockCaptureDevicesEnabled, true);
 
-            let [overriddenResult] = await Promise.all([
-                InspectorTest.awaitEvent("GetUserMedia"),
-                InspectorTest.evaluateInPage(`requestGetUserMedia()`),
-            ])
-            InspectorTest.expectTrue(overriddenResult.data.success, "getUserMedia should not fail when no devices are available");
+            InspectorTest.evaluateInPage(`validateMockUsage(true)`);
+            result = await InspectorTest.awaitEvent("ValidateMock");
+            InspectorTest.log("Mock use check: " + result.data);
+
 
             InspectorTest.log("Removing MockCaptureDevicesEnabled override...");
             await PageAgent.overrideSetting(InspectorBackend.Enum.Page.Setting.MockCaptureDevicesEnabled);
 
-            let [originalResult] = await Promise.all([
-                InspectorTest.awaitEvent("GetUserMedia"),
-                InspectorTest.evaluateInPage(`requestGetUserMedia()`),
-            ])
-            InspectorTest.log("Expected Error: " + originalResult.data.error);
+            InspectorTest.evaluateInPage(`validateMockUsage(true)`);
+            result = await InspectorTest.awaitEvent("ValidateMock");
+            InspectorTest.log("Mock use check: " + result.data);
         },
     });
 
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 426bcae..652f8b7 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,22 @@
+2019-12-05  youenn fablet  <youenn@apple.com>
+
+        inspector/page/overrideSetting-MockCaptureDevicesEnabled.html is failing after removal of internals.setMockMediaCaptureDevicesEnabled API
+        https://bugs.webkit.org/show_bug.cgi?id=204849
+
+        Reviewed by Eric Carlson.
+
+        Add API and internals to check which center is used in WebProcess.
+        Covered by updated test.
+
+        * platform/mock/MockRealtimeMediaSourceCenter.cpp:
+        (WebCore::MockRealtimeMediaSourceCenter::setMockRealtimeMediaSourceCenterEnabled):
+        (WebCore::MockRealtimeMediaSourceCenter::mockRealtimeMediaSourceCenterEnabled):
+        * platform/mock/MockRealtimeMediaSourceCenter.h:
+        * testing/Internals.cpp:
+        (WebCore::Internals::isMockRealtimeMediaSourceCenterEnabled):
+        * testing/Internals.h:
+        * testing/Internals.idl:
+
 2019-12-05  Eric Carlson  <eric.carlson@apple.com>
 
         WPT test MediaStream-MediaElement-srcObject.https.html times out
diff --git a/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp b/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp
index e6b8426..f77da7a 100644
--- a/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp
+++ b/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp
@@ -191,16 +191,15 @@
 
 void MockRealtimeMediaSourceCenter::setMockRealtimeMediaSourceCenterEnabled(bool enabled)
 {
-    static bool active = false;
-    if (active == enabled)
-        return;
-
-    active = enabled;
-
-    RealtimeMediaSourceCenter& center = RealtimeMediaSourceCenter::singleton();
     MockRealtimeMediaSourceCenter& mock = singleton();
 
-    if (active) {
+    if (mock.m_isEnabled == enabled)
+        return;
+
+    mock.m_isEnabled = enabled;
+    RealtimeMediaSourceCenter& center = RealtimeMediaSourceCenter::singleton();
+
+    if (mock.m_isEnabled) {
         if (mock.m_isMockAudioCaptureEnabled)
             center.setAudioCaptureFactory(mock.audioCaptureFactory());
         if (mock.m_isMockVideoCaptureEnabled)
@@ -220,10 +219,7 @@
 
 bool MockRealtimeMediaSourceCenter::mockRealtimeMediaSourceCenterEnabled()
 {
-    MockRealtimeMediaSourceCenter& mock = singleton();
-    RealtimeMediaSourceCenter& center = RealtimeMediaSourceCenter::singleton();
-
-    return &center.audioCaptureFactory() == &mock.audioCaptureFactory() || &center.videoCaptureFactory() == &mock.videoCaptureFactory() || &center.displayCaptureFactory() == &mock.displayCaptureFactory();
+    return singleton().m_isEnabled;
 }
 
 static void createCaptureDevice(const MockMediaDevice& device)
diff --git a/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h b/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h
index 6d16fe7..1c5aa66 100644
--- a/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h
+++ b/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h
@@ -94,6 +94,7 @@
     bool m_isMockAudioCaptureEnabled { true };
     bool m_isMockVideoCaptureEnabled { true };
     bool m_isMockDisplayCaptureEnabled { true };
+    bool m_isEnabled { false };
 };
 
 }
diff --git a/Source/WebCore/testing/Internals.cpp b/Source/WebCore/testing/Internals.cpp
index f623afd..b84bfff 100644
--- a/Source/WebCore/testing/Internals.cpp
+++ b/Source/WebCore/testing/Internals.cpp
@@ -4884,6 +4884,11 @@
 {
     track.source().setInterruptedForTesting(interrupted);
 }
+
+bool Internals::isMockRealtimeMediaSourceCenterEnabled()
+{
+    return MockRealtimeMediaSourceCenter::mockRealtimeMediaSourceCenterEnabled();
+}
 #endif
 
 bool Internals::supportsAudioSession() const
diff --git a/Source/WebCore/testing/Internals.h b/Source/WebCore/testing/Internals.h
index 78b9b28..ec32617 100644
--- a/Source/WebCore/testing/Internals.h
+++ b/Source/WebCore/testing/Internals.h
@@ -744,6 +744,7 @@
     void simulateMediaStreamTrackCaptureSourceFailure(MediaStreamTrack&);
     void setMediaStreamTrackIdentifier(MediaStreamTrack&, String&& id);
     void setMediaStreamSourceInterrupted(MediaStreamTrack&, bool);
+    bool isMockRealtimeMediaSourceCenterEnabled();
 #endif
 
     bool supportsAudioSession() const;
diff --git a/Source/WebCore/testing/Internals.idl b/Source/WebCore/testing/Internals.idl
index 936c2a7..3af7dbe 100644
--- a/Source/WebCore/testing/Internals.idl
+++ b/Source/WebCore/testing/Internals.idl
@@ -725,6 +725,7 @@
     [Conditional=MEDIA_STREAM] void simulateMediaStreamTrackCaptureSourceFailure(MediaStreamTrack track);
     [Conditional=MEDIA_STREAM] void setMediaStreamTrackIdentifier(MediaStreamTrack track, DOMString identifier);
     [Conditional=MEDIA_STREAM] void setMediaStreamSourceInterrupted(MediaStreamTrack track, boolean interrupted);
+    [Conditional=MEDIA_STREAM] boolean isMockRealtimeMediaSourceCenterEnabled();
 
     unsigned long long documentIdentifier(Document document);
     boolean isDocumentAlive(unsigned long long documentIdentifier);
diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog
index 0f32a53..314d7fc 100644
--- a/Source/WebKit/ChangeLog
+++ b/Source/WebKit/ChangeLog
@@ -1,3 +1,22 @@
+2019-12-05  youenn fablet  <youenn@apple.com>
+
+        inspector/page/overrideSetting-MockCaptureDevicesEnabled.html is failing after removal of internals.setMockMediaCaptureDevicesEnabled API
+        https://bugs.webkit.org/show_bug.cgi?id=204849
+
+        Reviewed by Eric Carlson.
+
+        Synchronize the center with the preferences when the value might be updated.
+        Add API to check which center is used in UIProcess.
+
+        * UIProcess/API/C/WKPage.cpp:
+        (WKPageIsMockRealtimeMediaSourceCenterEnabled):
+        * UIProcess/API/C/WKPagePrivate.h:
+        * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
+        (WebKit::UserMediaPermissionRequestManagerProxy::UserMediaPermissionRequestManagerProxy):
+        (WebKit::UserMediaPermissionRequestManagerProxy::setMockCaptureDevicesEnabledOverride):
+        * UIProcess/UserMediaPermissionRequestManagerProxy.h:
+        (WebKit::UserMediaPermissionRequestManagerProxy::setMockCaptureDevicesEnabledOverride): Deleted.
+
 2019-12-04  Joonghun Park  <jh718.park@samsung.com>
 
         Unreviewed. Remove build warnings below since r253025.
diff --git a/Source/WebKit/UIProcess/API/C/WKPage.cpp b/Source/WebKit/UIProcess/API/C/WKPage.cpp
index e6dd375..4d8f6cf 100644
--- a/Source/WebKit/UIProcess/API/C/WKPage.cpp
+++ b/Source/WebKit/UIProcess/API/C/WKPage.cpp
@@ -76,6 +76,7 @@
 #include "WebProcessProxy.h"
 #include "WebProtectionSpace.h"
 #include <WebCore/ContentRuleListResults.h>
+#include <WebCore/MockRealtimeMediaSourceCenter.h>
 #include <WebCore/Page.h>
 #include <WebCore/SSLKeyGenerator.h>
 #include <WebCore/SecurityOriginData.h>
@@ -2937,3 +2938,12 @@
     toImpl(page)->setOrientationForMediaCapture(orientation);
 #endif
 }
+
+WK_EXPORT bool WKPageIsMockRealtimeMediaSourceCenterEnabled(WKPageRef)
+{
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+    return MockRealtimeMediaSourceCenter::mockRealtimeMediaSourceCenterEnabled();
+#else
+    return false;
+#endif
+}
diff --git a/Source/WebKit/UIProcess/API/C/WKPagePrivate.h b/Source/WebKit/UIProcess/API/C/WKPagePrivate.h
index 1ed824c..0e62f61 100644
--- a/Source/WebKit/UIProcess/API/C/WKPagePrivate.h
+++ b/Source/WebKit/UIProcess/API/C/WKPagePrivate.h
@@ -192,6 +192,7 @@
 WK_EXPORT void WKPageMarkAdClickAttributionsAsExpiredForTesting(WKPageRef page, WKPageMarkAdClickAttributionsAsExpiredForTestingFunction callback, void* callbackContext);
 
 WK_EXPORT void WKPageSetMockCameraOrientation(WKPageRef page, uint64_t orientation);
+WK_EXPORT bool WKPageIsMockRealtimeMediaSourceCenterEnabled(WKPageRef page);
 
 #ifdef __cplusplus
 }
diff --git a/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp b/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp
index 403fd2d2..7f3bd12 100644
--- a/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp
+++ b/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp
@@ -79,6 +79,7 @@
 #if ENABLE(MEDIA_STREAM)
     proxies().add(this);
 #endif
+    syncWithWebCorePrefs();
 }
 
 UserMediaPermissionRequestManagerProxy::~UserMediaPermissionRequestManagerProxy()
@@ -683,6 +684,12 @@
 #endif
 }
 
+void UserMediaPermissionRequestManagerProxy::setMockCaptureDevicesEnabledOverride(Optional<bool> enabled)
+{
+    m_mockDevicesEnabledOverride = enabled;
+    syncWithWebCorePrefs();
+}
+
 void UserMediaPermissionRequestManagerProxy::syncWithWebCorePrefs() const
 {
 #if ENABLE(MEDIA_STREAM)
diff --git a/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h b/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h
index 2498392..6f01a1f 100644
--- a/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h
+++ b/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h
@@ -86,7 +86,7 @@
         Prompt
     };
 
-    void setMockCaptureDevicesEnabledOverride(Optional<bool> enabled) { m_mockDevicesEnabledOverride = enabled; }
+    void setMockCaptureDevicesEnabledOverride(Optional<bool>);
     bool hasPendingCapture() const { return m_hasPendingCapture; }
 
 private:
diff --git a/Tools/ChangeLog b/Tools/ChangeLog
index e728723..563f846 100644
--- a/Tools/ChangeLog
+++ b/Tools/ChangeLog
@@ -1,3 +1,22 @@
+2019-12-05  youenn fablet  <youenn@apple.com>
+
+        inspector/page/overrideSetting-MockCaptureDevicesEnabled.html is failing after removal of internals.setMockMediaCaptureDevicesEnabled API
+        https://bugs.webkit.org/show_bug.cgi?id=204849
+
+        Reviewed by Eric Carlson.
+
+        Add test runner API to check which center (mock or not) is used in UIProcess side.
+
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        (WTR::TestRunner::isMockRealtimeMediaSourceCenterEnabled):
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::isMockRealtimeMediaSourceCenterEnabled const):
+        * WebKitTestRunner/TestController.h:
+        * WebKitTestRunner/TestInvocation.cpp:
+        (WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle):
+
 2019-12-05  Zalan Bujtas  <zalan@apple.com>
 
         [LFC][IFC] Move trailing trimming logic to LineBuilder::TrimmableContent
diff --git a/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl b/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl
index 9fdc205..9e53b5b 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl
+++ b/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl
@@ -388,6 +388,7 @@
     void removeMockMediaDevice(DOMString persistentId);
     void resetMockMediaDevices();
     void setMockCameraOrientation(unsigned long orientation);
+    boolean isMockRealtimeMediaSourceCenterEnabled();
 
     void injectUserScript(DOMString string);
     readonly attribute unsigned long userScriptInjectedCount;
diff --git a/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp b/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp
index 182c2c6..fe9e2fe 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp
+++ b/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp
@@ -2424,6 +2424,15 @@
     WKBundlePostSynchronousMessage(InjectedBundle::singleton().bundle(), messageName.get(), messageBody.get(), nullptr);
 }
 
+bool TestRunner::isMockRealtimeMediaSourceCenterEnabled()
+{
+    auto messageName = adoptWK(WKStringCreateWithUTF8CString("IsMockRealtimeMediaSourceCenterEnabled"));
+    WKTypeRef returnData = nullptr;
+    WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()->page(), messageName.get(), nullptr, &returnData);
+    ASSERT(WKGetTypeID(returnData) == WKBooleanGetTypeID());
+    return WKBooleanGetValue(adoptWK(static_cast<WKBooleanRef>(returnData)).get());
+}
+
 #if PLATFORM(MAC)
 void TestRunner::connectMockGamepad(unsigned index)
 {
diff --git a/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h b/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h
index 76f6676..955dd0f 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h
+++ b/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h
@@ -492,6 +492,7 @@
     void removeMockMediaDevice(JSStringRef persistentId);
     void resetMockMediaDevices();
     void setMockCameraOrientation(unsigned);
+    bool isMockRealtimeMediaSourceCenterEnabled();
 
     size_t userScriptInjectedCount() const;
     void injectUserScript(JSStringRef);
diff --git a/Tools/WebKitTestRunner/TestController.cpp b/Tools/WebKitTestRunner/TestController.cpp
index f56d0c9..88a65ab 100644
--- a/Tools/WebKitTestRunner/TestController.cpp
+++ b/Tools/WebKitTestRunner/TestController.cpp
@@ -3640,6 +3640,11 @@
     WKPageSetMockCameraOrientation(m_mainWebView->page(), orientation);
 }
 
+bool TestController::isMockRealtimeMediaSourceCenterEnabled() const
+{
+    return WKPageIsMockRealtimeMediaSourceCenterEnabled(m_mainWebView->page());
+}
+
 #if !PLATFORM(COCOA)
 void TestController::platformAddTestOptions(TestOptions&) const
 {
diff --git a/Tools/WebKitTestRunner/TestController.h b/Tools/WebKitTestRunner/TestController.h
index 004e535..24ef4cb 100644
--- a/Tools/WebKitTestRunner/TestController.h
+++ b/Tools/WebKitTestRunner/TestController.h
@@ -295,6 +295,7 @@
     void removeMockMediaDevice(WKStringRef persistentID);
     void resetMockMediaDevices();
     void setMockCameraOrientation(uint64_t);
+    bool isMockRealtimeMediaSourceCenterEnabled() const;
 
     void injectUserScript(WKStringRef);
     
diff --git a/Tools/WebKitTestRunner/TestInvocation.cpp b/Tools/WebKitTestRunner/TestInvocation.cpp
index 674605d..098f5ba 100644
--- a/Tools/WebKitTestRunner/TestInvocation.cpp
+++ b/Tools/WebKitTestRunner/TestInvocation.cpp
@@ -985,6 +985,11 @@
         return nullptr;
     }
 
+    if (WKStringIsEqualToUTF8CString(messageName, "IsMockRealtimeMediaSourceCenterEnabled")) {
+        bool isMockRealtimeMediaSourceCenterEnabled = TestController::singleton().isMockRealtimeMediaSourceCenterEnabled();
+        return adoptWK(WKBooleanCreate(isMockRealtimeMediaSourceCenterEnabled));
+    }
+
 #if PLATFORM(MAC)
     if (WKStringIsEqualToUTF8CString(messageName, "ConnectMockGamepad")) {
         ASSERT(WKGetTypeID(messageBody) == WKUInt64GetTypeID());