Skip to content

Commit

Permalink
Constraints on the max width/height cause blurry getDisplayMedia vide…
Browse files Browse the repository at this point in the history
…o on Safari 17

https://bugs.webkit.org/show_bug.cgi?id=263015
rdar://116810370

Reviewed by Eric Carlson.

We were applying constraints at the time of starting the capture.
For getDisplayMedia, we do not know yet the size of window/screen, so we start with 640x480.
Later on, the size may increase, but we were not recomputing the constraints and our resizer was sticking to the old values.

Whenever there is a change of size, we are now calling configuration change.
Within UserMediaCaptureManagerProxy, in case of getDisplayMedia, we will reapply constraints.
This will trigger recomputation of the resizer based on any max constraint.

We add a test that is emulating the change of screen being captured.
We update an existing testRunner API for that purpose.

* LayoutTests/fast/mediastream/getDisplayMedia-max-constraints4-expected.txt: Added.
* LayoutTests/fast/mediastream/getDisplayMedia-max-constraints4.html: Added.
* LayoutTests/fast/mediastream/mediastreamtrack-configurationchange.html:
* LayoutTests/platform/glib/TestExpectations:
* Source/WebCore/platform/mediastream/cocoa/DisplayCaptureSourceCocoa.cpp:
(WebCore::DisplayCaptureSourceCocoa::emitFrame):
* Source/WebCore/platform/mediastream/mac/ScreenCaptureKitCaptureSource.mm:
(WebCore::ScreenCaptureKitCaptureSource::streamDidOutputVideoSampleBuffer):
* Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp:
(WebCore::MockDisplayCapturer::triggerMockCaptureConfigurationChange):
(WebCore::MockRealtimeDisplaySourceFactory::latestCapturer):
(WebCore::MockRealtimeMediaSourceCenter::triggerMockCaptureConfigurationChange):
(WebCore::MockRealtimeMediaSourceCenter::triggerMockMicrophoneConfigurationChange): Deleted.
* Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h:
* Source/WebKit/GPUProcess/GPUProcess.cpp:
(WebKit::GPUProcess::triggerMockCaptureConfigurationChange):
(WebKit::GPUProcess::triggerMockMicrophoneConfigurationChange): Deleted.
* Source/WebKit/GPUProcess/GPUProcess.h:
* Source/WebKit/GPUProcess/GPUProcess.messages.in:
* Source/WebKit/UIProcess/API/C/WKPage.cpp:
(WKPageTriggerMockCaptureConfigurationChange):
(WKPageTriggerMockMicrophoneConfigurationChange): Deleted.
* Source/WebKit/UIProcess/API/C/WKPagePrivate.h:
* Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
(WebKit::UserMediaCaptureManagerProxy::SourceProxy::updateVideoConstraints):
(WebKit::UserMediaCaptureManagerProxy::SourceProxy::applyConstraints):
* Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp:
(WebKit::GPUProcessProxy::triggerMockCaptureConfigurationChange):
(WebKit::GPUProcessProxy::triggerMockMicrophoneConfigurationChange): Deleted.
* Source/WebKit/UIProcess/GPU/GPUProcessProxy.h:
* Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
* Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp:
(WTR::TestRunner::triggerMockCaptureConfigurationChange):
(WTR::TestRunner::triggerMockMicrophoneConfigurationChange): Deleted.
* Tools/WebKitTestRunner/InjectedBundle/TestRunner.h:
* Tools/WebKitTestRunner/TestController.cpp:
(WTR::TestController::triggerMockCaptureConfigurationChange):
(WTR::TestController::triggerMockMicrophoneConfigurationChange): Deleted.
* Tools/WebKitTestRunner/TestController.h:
* Tools/WebKitTestRunner/TestInvocation.cpp:
(WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle):

Canonical link: https://commits.webkit.org/269406@main
  • Loading branch information
youennf committed Oct 17, 2023
1 parent d90f93a commit 2a1363e
Show file tree
Hide file tree
Showing 22 changed files with 199 additions and 49 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@


PASS Underlying change of resolution should update how the constraints are used

54 changes: 54 additions & 0 deletions LayoutTests/fast/mediastream/getDisplayMedia-max-constraints4.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>getDisplayMedia track support of max constraints</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="resources/getDisplayMedia-utils.js"></script>
</head>
<body>
<video id=video autoplay playsinline></video>
<script>
promise_test(async (test) => {
const stream = await callGetDisplayMedia({ video: { height: { max: 2000 }, width : { max : 3000 } } });
video.srcObject = stream;
await video.play();

const videoFrame1 = await new Promise((resolve, reject) => video.requestVideoFrameCallback(() => {
resolve(new VideoFrame(video));
setTimeout(() => reject("videoFrame1 timeout"), 5000);
}));

assert_equals(videoFrame1.codedWidth, 1920);
assert_equals(videoFrame1.codedHeight, 1080);
videoFrame1.close();

const promise = new Promise((resolve, reject) => {
stream.getVideoTracks()[0].onconfigurationchange = resolve;
setTimeout(() => reject("configuration change timeout"), 5000);
});
if (window.testRunner)
testRunner.triggerMockCaptureConfigurationChange(false, true);
await promise;

let videoFrame2;
let counter = 0;
while (counter++ < 100) {
if (videoFrame2)
videoFrame2.close();
videoFrame2 = await new Promise((resolve, reject) => video.requestVideoFrameCallback(() => {
resolve(new VideoFrame(video));
setTimeout(() => reject("videoFrame2 timeout"), 5000);
}));
if (videoFrame2.codedWidth > 2000)
break;
}
assert_less_than(counter, 100);
assert_equals(videoFrame2.codedWidth, 3000);
assert_equals(videoFrame2.codedHeight, 1687);
videoFrame2.close();
}, "Underlying change of resolution should update how the constraints are used");
</script>
</body>
</html>
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

assert_equals(track.label, "Mock audio device 1");

testRunner.triggerMockMicrophoneConfigurationChange();
testRunner.triggerMockCaptureConfigurationChange(true, false);

await new Promise((resolve, reject) => {
track.onconfigurationchange = resolve;
Expand Down
2 changes: 2 additions & 0 deletions LayoutTests/platform/glib/TestExpectations
Original file line number Diff line number Diff line change
Expand Up @@ -1839,6 +1839,8 @@ webkit.org/b/194611 http/wpt/webrtc/getUserMedia-processSwapping.html [ Failure

webkit.org/b/261099 webrtc/video-lowercase-media-subtype.html [ Skip ]

fast/mediastream/getDisplayMedia-max-constraints4.html [ Skip ]

# DataChannel GstWebRTC implementation incomplete, missing stats support.
webkit.org/b/235885 webrtc/datachannel/datachannel-stats.html [ Skip ]
webkit.org/b/235885 webrtc/datachannel/getStats-no-prflx-remote-candidate.html [ Skip ]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ void DisplayCaptureSourceCocoa::emitFrame()
if (imageSize.isEmpty())
return;

if (intrinsicSize() != imageSize) {
if (intrinsicSize() != imageSize || size() != imageSize) {
setIntrinsicSize(imageSize);
setSize(imageSize);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,12 @@ - (void)stream:(SCStream *)stream didOutputSampleBuffer:(CMSampleBufferRef)sampl
}

m_currentFrame = WTFMove(sampleBuffer);
m_intrinsicSize = IntSize(PAL::CMVideoFormatDescriptionGetPresentationDimensions(PAL::CMSampleBufferGetFormatDescription(m_currentFrame.get()), true, true));

auto intrinsicSize = IntSize(PAL::CMVideoFormatDescriptionGetPresentationDimensions(PAL::CMSampleBufferGetFormatDescription(m_currentFrame.get()), true, true));
if (!m_intrinsicSize || *m_intrinsicSize != intrinsicSize) {
m_intrinsicSize = intrinsicSize;
configurationChanged();
}
}

dispatch_queue_t ScreenCaptureKitCaptureSource::captureQueue()
Expand Down
65 changes: 56 additions & 9 deletions Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,10 +131,14 @@ class MockRealtimeVideoSourceFactory : public VideoCaptureFactory {
};

#if PLATFORM(COCOA)
class MockDisplayCapturer final : public DisplayCaptureSourceCocoa::Capturer {
class MockDisplayCapturer final
: public DisplayCaptureSourceCocoa::Capturer
, public CanMakeWeakPtr<MockDisplayCapturer> {
public:
MockDisplayCapturer(const CaptureDevice&, PageIdentifier);

void triggerMockCaptureConfigurationChange();

private:
bool start() final;
void stop() final { m_source->stop(); }
Expand Down Expand Up @@ -189,26 +193,48 @@ IntSize MockDisplayCapturer::intrinsicSize() const
auto& properties = std::get<MockDisplayProperties>(device->properties);
return properties.defaultSize;
}

void MockDisplayCapturer::triggerMockCaptureConfigurationChange()
{
auto deviceId = m_source->persistentID();
auto device = MockRealtimeMediaSourceCenter::mockDeviceWithPersistentID(deviceId.startsWith("WINDOW"_s) ? "WINDOW-2"_s : "SCREEN-2"_s);
ASSERT(device);
if (!device)
return;

bool isStarted = m_source->isProducingData();
auto pageIdentifier = m_source->pageIdentifier();
m_source = MockRealtimeVideoSourceMac::createForMockDisplayCapturer(String { device->persistentId }, AtomString { device->label }, MediaDeviceHashSalts { "persistent"_s, "ephemeral"_s }, pageIdentifier);
if (isStarted)
m_source->start();

configurationChanged();
}
#endif // PLATFORM(COCOA)

class MockRealtimeDisplaySourceFactory : public DisplayCaptureFactory {
public:
static MockRealtimeDisplaySourceFactory& singleton();

CaptureSourceOrError createDisplayCaptureSource(const CaptureDevice& device, MediaDeviceHashSalts&& hashSalts, const MediaConstraints* constraints, PageIdentifier pageIdentifier) final
{
if (!MockRealtimeMediaSourceCenter::captureDeviceWithPersistentID(device.type(), device.persistentId()))
return CaptureSourceOrError({ "Unable to find mock display device with given persistentID"_s, MediaAccessDenialReason::PermissionDenied });

switch (device.type()) {
case CaptureDevice::DeviceType::Screen:
case CaptureDevice::DeviceType::Window:
case CaptureDevice::DeviceType::Window: {
#if PLATFORM(COCOA)
return DisplayCaptureSourceCocoa::create(UniqueRef<DisplayCaptureSourceCocoa::Capturer>(makeUniqueRef<MockDisplayCapturer>(device, pageIdentifier)), device, WTFMove(hashSalts), constraints, pageIdentifier);
auto capturer = makeUniqueRef<MockDisplayCapturer>(device, pageIdentifier);
m_capturer = capturer.get();
return DisplayCaptureSourceCocoa::create(UniqueRef<DisplayCaptureSourceCocoa::Capturer>(WTFMove(capturer)), device, WTFMove(hashSalts), constraints, pageIdentifier);
#elif USE(GSTREAMER)
return MockDisplayCaptureSourceGStreamer::create(device, WTFMove(hashSalts), constraints, pageIdentifier);
#else
return MockRealtimeVideoSource::create(String { device.persistentId() }, AtomString { device.label() }, WTFMove(hashSalts), constraints, pageIdentifier);
#endif
break;
}
case CaptureDevice::DeviceType::Microphone:
case CaptureDevice::DeviceType::Speaker:
case CaptureDevice::DeviceType::Camera:
Expand All @@ -221,8 +247,15 @@ class MockRealtimeDisplaySourceFactory : public DisplayCaptureFactory {
return { };
}

#if PLATFORM(COCOA)
WeakPtr<MockDisplayCapturer> latestCapturer() { return m_capturer; }
#endif

private:
DisplayCaptureManager& displayCaptureDeviceManager() final { return MockRealtimeMediaSourceCenter::singleton().displayCaptureDeviceManager(); }
#if PLATFORM(COCOA)
WeakPtr<MockDisplayCapturer> m_capturer;
#endif
};

class MockRealtimeAudioSourceFactory final : public AudioCaptureFactory
Expand Down Expand Up @@ -344,14 +377,23 @@ void MockRealtimeMediaSourceCenter::setMockCaptureDevicesInterrupted(bool isCame
MockRealtimeAudioSource::setIsInterrupted(isMicrophoneInterrupted);
}

void MockRealtimeMediaSourceCenter::triggerMockMicrophoneConfigurationChange()
void MockRealtimeMediaSourceCenter::triggerMockCaptureConfigurationChange(bool forMicrophone, bool forDisplay)
{
#if PLATFORM(COCOA)
auto devices = audioCaptureDeviceManager().captureDevices();
if (devices.size() <= 1)
return;
MockAudioSharedUnit::increaseBufferSize();
MockAudioSharedUnit::singleton().handleNewCurrentMicrophoneDevice(WTFMove(devices[1]));
if (forMicrophone) {
auto devices = audioCaptureDeviceManager().captureDevices();
if (devices.size() > 1) {
MockAudioSharedUnit::increaseBufferSize();
MockAudioSharedUnit::singleton().handleNewCurrentMicrophoneDevice(WTFMove(devices[1]));
}
}
if (forDisplay) {
if (auto capturer = MockRealtimeDisplaySourceFactory::singleton().latestCapturer())
capturer->triggerMockCaptureConfigurationChange();
}
#else
UNUSED_PARAM(forMicrophone);
UNUSED_PARAM(forDisplay);
#endif
}

Expand Down Expand Up @@ -528,6 +570,11 @@ VideoCaptureFactory& MockRealtimeMediaSourceCenter::videoCaptureFactory()
}

DisplayCaptureFactory& MockRealtimeMediaSourceCenter::displayCaptureFactory()
{
return MockRealtimeDisplaySourceFactory::singleton();
}

MockRealtimeDisplaySourceFactory& MockRealtimeDisplaySourceFactory::singleton()
{
static NeverDestroyed<MockRealtimeDisplaySourceFactory> factory;
return factory.get();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class MockRealtimeMediaSourceCenter {
WEBCORE_EXPORT static void resetDevices();
WEBCORE_EXPORT static void setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted);

WEBCORE_EXPORT void triggerMockMicrophoneConfigurationChange();
WEBCORE_EXPORT void triggerMockCaptureConfigurationChange(bool forMicrophone, bool forDisplay);

void setMockAudioCaptureEnabled(bool isEnabled) { m_isMockAudioCaptureEnabled = isEnabled; }
void setMockVideoCaptureEnabled(bool isEnabled) { m_isMockVideoCaptureEnabled = isEnabled; }
Expand Down
4 changes: 2 additions & 2 deletions Source/WebKit/GPUProcess/GPUProcess.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -465,9 +465,9 @@ void GPUProcess::setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool
MockRealtimeMediaSourceCenter::setMockCaptureDevicesInterrupted(isCameraInterrupted, isMicrophoneInterrupted);
}

void GPUProcess::triggerMockMicrophoneConfigurationChange()
void GPUProcess::triggerMockCaptureConfigurationChange(bool forMicrophone, bool forDisplay)
{
MockRealtimeMediaSourceCenter::singleton().triggerMockMicrophoneConfigurationChange();
MockRealtimeMediaSourceCenter::singleton().triggerMockCaptureConfigurationChange(forMicrophone, forDisplay);
}
#endif // ENABLE(MEDIA_STREAM)

Expand Down
2 changes: 1 addition & 1 deletion Source/WebKit/GPUProcess/GPUProcess.h
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ class GPUProcess : public AuxiliaryProcess, public ThreadSafeRefCounted<GPUProce
void setMockMediaDeviceIsEphemeral(const String&, bool);
void resetMockMediaDevices();
void setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted);
void triggerMockMicrophoneConfigurationChange();
void triggerMockCaptureConfigurationChange(bool forMicrophone, bool forDisplay);
#endif
#if HAVE(SCREEN_CAPTURE_KIT)
void promptForGetDisplayMedia(WebCore::DisplayCapturePromptType, CompletionHandler<void(std::optional<WebCore::CaptureDevice>)>&&);
Expand Down
2 changes: 1 addition & 1 deletion Source/WebKit/GPUProcess/GPUProcess.messages.in
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ messages -> GPUProcess LegacyReceiver {
SetMockMediaDeviceIsEphemeral(String persistentId, bool isEphemeral)
ResetMockMediaDevices()
SetMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted)
TriggerMockMicrophoneConfigurationChange()
TriggerMockCaptureConfigurationChange(bool forMicrophone, bool forDisplay)
#endif
#if HAVE(SC_CONTENT_SHARING_PICKER)
SetUseSCContentSharingPicker(bool use)
Expand Down
13 changes: 9 additions & 4 deletions Source/WebKit/UIProcess/API/C/WKPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3196,13 +3196,18 @@ void WKPageSetMockCaptureDevicesInterrupted(WKPageRef pageRef, bool isCameraInte
#endif
}

void WKPageTriggerMockMicrophoneConfigurationChange(WKPageRef pageRef)
void WKPageTriggerMockCaptureConfigurationChange(WKPageRef pageRef, bool forMicrophone, bool forDisplay)
{
CRASH_IF_SUSPENDED;
#if ENABLE(MEDIA_STREAM) && ENABLE(GPU_PROCESS)
#if ENABLE(MEDIA_STREAM)
MockRealtimeMediaSourceCenter::singleton().triggerMockCaptureConfigurationChange(forMicrophone, forDisplay);

#if ENABLE(GPU_PROCESS)
auto& gpuProcess = toImpl(pageRef)->process().processPool().ensureGPUProcess();
gpuProcess.triggerMockMicrophoneConfigurationChange();
#endif
gpuProcess.triggerMockCaptureConfigurationChange(forMicrophone, forDisplay);
#endif // ENABLE(GPU_PROCESS)

#endif // ENABLE(MEDIA_STREAM)
}

void WKPageLoadedSubresourceDomains(WKPageRef pageRef, WKPageLoadedSubresourceDomainsFunction callback, void* callbackContext)
Expand Down
2 changes: 1 addition & 1 deletion Source/WebKit/UIProcess/API/C/WKPagePrivate.h
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ WK_EXPORT void WKPageSetPrivateClickMeasurementAppBundleIDForTesting(WKPageRef p
WK_EXPORT void WKPageSetMockCameraOrientation(WKPageRef page, uint64_t orientation);
WK_EXPORT bool WKPageIsMockRealtimeMediaSourceCenterEnabled(WKPageRef page);
WK_EXPORT void WKPageSetMockCaptureDevicesInterrupted(WKPageRef page, bool isCameraInterrupted, bool isMicrophoneInterrupted);
WK_EXPORT void WKPageTriggerMockMicrophoneConfigurationChange(WKPageRef page);
WK_EXPORT void WKPageTriggerMockCaptureConfigurationChange(WKPageRef page, bool forMicrophone, bool forDisplay);

typedef void (*WKPageLoadedSubresourceDomainsFunction)(WKArrayRef domains, void* functionContext);
WK_EXPORT void WKPageLoadedSubresourceDomains(WKPageRef page, WKPageLoadedSubresourceDomainsFunction callback, void* callbackContext);
Expand Down
57 changes: 42 additions & 15 deletions Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,39 @@ class UserMediaCaptureManagerProxy::SourceProxy
void setShouldApplyRotation(bool shouldApplyRotation) { m_shouldApplyRotation = true; }
void setIsInBackground(bool value) { m_source->setIsInBackground(value); }

bool updateVideoConstraints(const WebCore::MediaConstraints& constraints)
{
m_videoConstraints = constraints;

auto resultingConstraints = m_source->extractVideoFrameSizeConstraints(constraints);

bool didChange = false;
if (resultingConstraints.width) {
didChange |= m_widthConstraint != *resultingConstraints.width;
m_widthConstraint = *resultingConstraints.width;
} else if (resultingConstraints.height) {
didChange |= !!m_widthConstraint;
m_widthConstraint = 0;
}
if (resultingConstraints.height) {
didChange |= m_heightConstraint != *resultingConstraints.height;
m_heightConstraint = *resultingConstraints.height;
} else if (resultingConstraints.width) {
didChange |= !!m_heightConstraint;
m_heightConstraint = 0;
}

if (resultingConstraints.frameRate) {
didChange |= m_frameRateConstraint != *resultingConstraints.frameRate;
m_frameRateConstraint = *resultingConstraints.frameRate;
} else {
didChange |= !!m_frameRateConstraint;
m_frameRateConstraint = 0;
}

return didChange;
}

std::optional<WebCore::RealtimeMediaSource::ApplyConstraintsError> applyConstraints(const WebCore::MediaConstraints& constraints)
{
if (m_source->type() != RealtimeMediaSource::Type::Video)
Expand All @@ -135,22 +168,8 @@ class UserMediaCaptureManagerProxy::SourceProxy
m_source->removeVideoFrameObserver(*this);

auto result = m_source->applyConstraints(constraints);
if (!result) {
auto resultingConstraints = m_source->extractVideoFrameSizeConstraints(constraints);

if (resultingConstraints.width)
m_widthConstraint = *resultingConstraints.width;
else if (resultingConstraints.height)
m_widthConstraint = 0;
if (resultingConstraints.height)
m_heightConstraint = *resultingConstraints.height;
else if (resultingConstraints.width)
m_heightConstraint = 0;
if (resultingConstraints.frameRate)
m_frameRateConstraint = *resultingConstraints.frameRate;

if (!result && updateVideoConstraints(constraints))
m_settings = { };
}

m_source->addVideoFrameObserver(*this, { m_widthConstraint, m_heightConstraint }, m_frameRateConstraint);

Expand Down Expand Up @@ -216,6 +235,12 @@ class UserMediaCaptureManagerProxy::SourceProxy

void sourceConfigurationChanged() final
{
auto deviceType = m_source->deviceType();
if ((deviceType == CaptureDevice::DeviceType::Screen || deviceType == CaptureDevice::DeviceType::Window) && m_videoConstraints && updateVideoConstraints(*m_videoConstraints)) {
m_source->removeVideoFrameObserver(*this);
m_source->addVideoFrameObserver(*this, { m_widthConstraint, m_heightConstraint }, m_frameRateConstraint);
}

m_connection->send(Messages::UserMediaCaptureManager::SourceConfigurationChanged(m_id, m_source->persistentID(), settings(), m_source->capabilities()), 0);
}

Expand Down Expand Up @@ -330,6 +355,8 @@ class UserMediaCaptureManagerProxy::SourceProxy
int m_widthConstraint { 0 };
int m_heightConstraint { 0 };
double m_frameRateConstraint { 0 };

std::optional<MediaConstraints> m_videoConstraints;
};

UserMediaCaptureManagerProxy::UserMediaCaptureManagerProxy(UniqueRef<ConnectionProxy>&& connectionProxy)
Expand Down
4 changes: 2 additions & 2 deletions Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -413,9 +413,9 @@ void GPUProcessProxy::setMockCaptureDevicesInterrupted(bool isCameraInterrupted,
send(Messages::GPUProcess::SetMockCaptureDevicesInterrupted { isCameraInterrupted, isMicrophoneInterrupted }, 0);
}

void GPUProcessProxy::triggerMockMicrophoneConfigurationChange()
void GPUProcessProxy::triggerMockCaptureConfigurationChange(bool forMicrophone, bool forDisplay)
{
send(Messages::GPUProcess::TriggerMockMicrophoneConfigurationChange { }, 0);
send(Messages::GPUProcess::TriggerMockCaptureConfigurationChange { forMicrophone, forDisplay }, 0);
}
#endif // ENABLE(MEDIA_STREAM)

Expand Down
Loading

0 comments on commit 2a1363e

Please sign in to comment.