Skip to content

Commit

Permalink
In PWA, HTML Video Element may be unable to play stream from 'getUser…
Browse files Browse the repository at this point in the history
…Media()'

https://bugs.webkit.org/show_bug.cgi?id=252465
rdar://111500785

Reviewed by Eric Carlson.

In case the same GPU process is used by several SafariViewServices, mediaserverd may think that
a capturing session is in the background while it is in foreground.
Ideally mediaserverd would compute this from an audit token or something similar we would pass them.

Currently, it is based on pid forwarding.
As a temporary workaround, we are now storing which pid is to be used for a given WebProcess in RemoteMediaSessionHelperProxy.
When starting to produce data for camera, we are then ensuring that this pid is correctly set whenever starting to produce data.

We allow overriding of pid in MediaSessionHelperiOS, by adding a new ShouldOverride boolean.
Only AVVideoCaptureSource is using ShouldOverride::Yes, which should limit potential fallouts to camera capture cases.

* Source/WebCore/platform/audio/ios/MediaSessionHelperIOS.h:
* Source/WebCore/platform/audio/ios/MediaSessionHelperIOS.mm:
(MediaSessionHelperiOS::providePresentingApplicationPID):
* Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp:
(WebKit::GPUConnectionToWebProcess::overridePresentingApplicationPIDIfNeeded):
* Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h:
* Source/WebKit/GPUProcess/media/ios/RemoteMediaSessionHelperProxy.cpp:
(WebKit::RemoteMediaSessionHelperProxy::providePresentingApplicationPID):
(WebKit::RemoteMediaSessionHelperProxy::overridePresentingApplicationPIDIfNeeded):
* Source/WebKit/GPUProcess/media/ios/RemoteMediaSessionHelperProxy.h:
* Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
(WebKit::UserMediaCaptureManagerProxy::startProducingData):
* Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h:
(WebKit::UserMediaCaptureManagerProxy::ConnectionProxy::startProducingData):
* Source/WebKit/WebProcess/GPU/media/ios/RemoteMediaSessionHelper.cpp:
(WebKit::RemoteMediaSessionHelper::providePresentingApplicationPID):
* Source/WebKit/WebProcess/GPU/media/ios/RemoteMediaSessionHelper.h:

Canonical link: https://commits.webkit.org/265986@main
  • Loading branch information
youennf committed Jul 12, 2023
1 parent 58d1189 commit bbf6021
Show file tree
Hide file tree
Showing 10 changed files with 39 additions and 12 deletions.
5 changes: 4 additions & 1 deletion Source/WebCore/platform/audio/ios/MediaSessionHelperIOS.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,10 @@ class WEBCORE_EXPORT MediaSessionHelper : public ThreadSafeRefCountedAndCanMakeT

void startMonitoringWirelessRoutes();
void stopMonitoringWirelessRoutes();
virtual void providePresentingApplicationPID(int) = 0;

enum class ShouldOverride : bool { No, Yes };
void providePresentingApplicationPID(int pid) { providePresentingApplicationPID(pid, ShouldOverride::No); }
virtual void providePresentingApplicationPID(int, ShouldOverride) = 0;

void setIsExternalOutputDeviceAvailable(bool);

Expand Down
7 changes: 4 additions & 3 deletions Source/WebCore/platform/audio/ios/MediaSessionHelperIOS.mm
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ - (void)stopMonitoringAirPlayRoutes;
private:
void setIsPlayingToAutomotiveHeadUnit(bool);

void providePresentingApplicationPID(int) final;
void providePresentingApplicationPID(int, ShouldOverride) final;
void startMonitoringWirelessRoutesInternal() final;
void stopMonitoringWirelessRoutesInternal() final;

Expand Down Expand Up @@ -249,10 +249,10 @@ - (void)stopMonitoringAirPlayRoutes;
END_BLOCK_OBJC_EXCEPTIONS
}

void MediaSessionHelperiOS::providePresentingApplicationPID(int pid)
void MediaSessionHelperiOS::providePresentingApplicationPID(int pid, ShouldOverride shouldOverride)
{
#if HAVE(CELESTIAL)
if (m_presentedApplicationPID)
if (m_presentedApplicationPID && (*m_presentedApplicationPID == pid || shouldOverride == ShouldOverride::No))
return;

m_presentedApplicationPID = pid;
Expand All @@ -266,6 +266,7 @@ - (void)stopMonitoringAirPlayRoutes;
WTFLogAlways("Failed to set up PID proxying: %s", error.localizedDescription.UTF8String);
#else
UNUSED_PARAM(pid);
UNUSED_PARAM(shouldOverride);
#endif
}

Expand Down
16 changes: 12 additions & 4 deletions Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -220,11 +220,14 @@ class GPUProxyForCapture final : public UserMediaCaptureManagerProxy::Connection
}
#endif

void startProducingData(RealtimeMediaSource::Type type) final
void startProducingData(CaptureDevice::DeviceType type) final
{
if (type != RealtimeMediaSource::Type::Audio)
return;
m_process.startCapturingAudio();
if (type == CaptureDevice::DeviceType::Microphone)
m_process.startCapturingAudio();
#if PLATFORM(IOS)
else if (type == CaptureDevice::DeviceType::Camera)
m_process.overridePresentingApplicationPIDIfNeeded();
#endif
}

const ProcessIdentity& resourceOwner() const final
Expand Down Expand Up @@ -748,6 +751,11 @@ void GPUConnectionToWebProcess::ensureMediaSessionHelper()
{
mediaSessionHelperProxy();
}

void GPUConnectionToWebProcess::overridePresentingApplicationPIDIfNeeded()
{
mediaSessionHelperProxy().overridePresentingApplicationPIDIfNeeded();
}
#endif

#if ENABLE(LEGACY_ENCRYPTED_MEDIA)
Expand Down
4 changes: 4 additions & 0 deletions Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,10 @@ class GPUConnectionToWebProcess
void performWithMediaPlayerOnMainThread(WebCore::MediaPlayerIdentifier, Function<void(WebCore::MediaPlayer&)>&&);
#endif

#if PLATFORM(IOS_FAMILY)
void overridePresentingApplicationPIDIfNeeded();
#endif

private:
GPUConnectionToWebProcess(GPUProcess&, WebCore::ProcessIdentifier, PAL::SessionID, IPC::Connection::Handle&&, GPUProcessConnectionParameters&&);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,16 @@ void RemoteMediaSessionHelperProxy::stopMonitoringWirelessRoutes()

void RemoteMediaSessionHelperProxy::providePresentingApplicationPID(int pid)
{
m_presentingApplicationPID = pid;
MediaSessionHelper::sharedHelper().providePresentingApplicationPID(pid);
}

void RemoteMediaSessionHelperProxy::overridePresentingApplicationPIDIfNeeded()
{
if (m_presentingApplicationPID)
MediaSessionHelper::sharedHelper().providePresentingApplicationPID(*m_presentingApplicationPID, MediaSessionHelper::ShouldOverride::Yes);
}

void RemoteMediaSessionHelperProxy::applicationWillEnterForeground(SuspendedUnderLock suspendedUnderLock)
{
m_gpuConnection.connection().send(Messages::RemoteMediaSessionHelper::ApplicationWillEnterForeground(suspendedUnderLock), { });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ class RemoteMediaSessionHelperProxy

void didReceiveMessageFromWebProcess(IPC::Connection& connection, IPC::Decoder& decoder) { didReceiveMessage(connection, decoder); }

void overridePresentingApplicationPIDIfNeeded();

private:
// IPC::MessageReceiver
void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
Expand All @@ -65,6 +67,7 @@ class RemoteMediaSessionHelperProxy

bool m_isMonitoringWirelessRoutes { false };
GPUConnectionToWebProcess& m_gpuConnection;
std::optional<int> m_presentingApplicationPID;
};

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@ void UserMediaCaptureManagerProxy::startProducingData(RealtimeMediaSourceIdentif
#if ENABLE(APP_PRIVACY_REPORT)
m_connectionProxy->setTCCIdentity();
#endif
m_connectionProxy->startProducingData(proxy->source().type());
m_connectionProxy->startProducingData(proxy->source().deviceType());
proxy->start();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ class UserMediaCaptureManagerProxy : private IPC::MessageReceiver {
#if ENABLE(APP_PRIVACY_REPORT)
virtual void setTCCIdentity() { }
#endif
virtual void startProducingData(WebCore::RealtimeMediaSource::Type) { }
virtual void startProducingData(WebCore::CaptureDevice::DeviceType) { }
virtual RemoteVideoFrameObjectHeap* remoteVideoFrameObjectHeap() { return nullptr; }
};
explicit UserMediaCaptureManagerProxy(UniqueRef<ConnectionProxy>&&);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,9 @@ void RemoteMediaSessionHelper::stopMonitoringWirelessRoutesInternal()
ensureConnection().send(Messages::RemoteMediaSessionHelperProxy::StopMonitoringWirelessRoutes(), { });
}

void RemoteMediaSessionHelper::providePresentingApplicationPID(int pid)
void RemoteMediaSessionHelper::providePresentingApplicationPID(int pid, ShouldOverride shouldOverride)
{
ASSERT_UNUSED(shouldOverride, shouldOverride == ShouldOverride::No);
ensureConnection().send(Messages::RemoteMediaSessionHelperProxy::ProvidePresentingApplicationPID(pid), { });
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ class RemoteMediaSessionHelper final
// MediaSessionHelper
void startMonitoringWirelessRoutesInternal() final;
void stopMonitoringWirelessRoutesInternal() final;
void providePresentingApplicationPID(int) final;
void providePresentingApplicationPID(int, ShouldOverride) final;

// Messages
void activeVideoRouteDidChange(SupportsAirPlayVideo, WebCore::MediaPlaybackTargetContext&&);
Expand Down

0 comments on commit bbf6021

Please sign in to comment.