Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 3ce5660d758653dc7dd49eef94fd38d4dcaebd6f
      
https://github.com/WebKit/WebKit/commit/3ce5660d758653dc7dd49eef94fd38d4dcaebd6f
  Author: Eric Carlson <[email protected]>
  Date:   2026-07-31 (Fri, 31 Jul 2026)

  Changed paths:
    A LayoutTests/http/tests/site-isolation/audio-session-active-expected.txt
    A LayoutTests/http/tests/site-isolation/audio-session-active.html
    M Source/WebCore/platform/audio/MediaSessionManagerClient.h
    M Source/WebCore/platform/audio/MediaSessionManagerInterface.cpp
    M Source/WebCore/platform/audio/MediaSessionManagerInterface.h
    M Source/WebKit/GPUProcess/GPUProcess.cpp
    M Source/WebKit/GPUProcess/GPUProcess.h
    M Source/WebKit/GPUProcess/GPUProcess.messages.in
    M Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp
    M Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.h
    M
Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.cpp
    M Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.h
    M Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp
    M Source/WebKit/UIProcess/GPU/GPUProcessProxy.h
    M Source/WebKit/UIProcess/Media/RemoteMediaSessionManagerProxy.cpp
    M Source/WebKit/UIProcess/Media/RemoteMediaSessionManagerProxy.h
    M Source/WebKit/UIProcess/WebProcessProxy.cpp
    M Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp
    M Source/WebKit/WebProcess/GPU/media/RemoteAudioSessionConfiguration.h
    M 
Source/WebKit/WebProcess/GPU/media/RemoteAudioSessionConfiguration.serialization.in
    M Tools/TestWebKitAPI/Tests/WebKit/WKWebView/SiteIsolation.mm

  Log Message:
  -----------
  [Site Isolation] Activate the audio session in the GPU process when site 
isolation is enabled
https://bugs.webkit.org/show_bug.cgi?id=320460
rdar://183427356

Reviewed by Andy Estes.

Under site isolation
RemoteMediaSessionManagerProxy is the UI-process shared AudioSession,
but its tryToSetActiveInternal() was a stub that always resolved without doing 
anything,
so the real audio session -- which lives per-web-process in the GPU process -- 
was never
actually activated or deactivated, and the web process's 
AudioSession::isActive() never
reflected whether audio was really active.

This PR makes activation work end to end:

1. Activation is routed through the MediaSessionManagerClient added in bug 
320247.
RemoteMediaSessionManagerProxy installs a client that, on activation, tells the 
GPU process
to activate the audio session for the web process that owns the triggering 
session, and
remembers that process so the matching deactivation targets it. The default
PageMediaSessionManagerClient keeps activating AudioSession::singleton() 
directly, so
non-site-isolation behavior is unchanged.

2. The GPU process pushes the resulting active state back to the owning web 
process via
a
new RemoteAudioSessionConfiguration::isActive field, and RemoteAudioSession 
mirrors it, so
AudioSession::isActive() and its observers behave the same with and without 
site isolation
even though the activation is decided in the UI process when site isolation is 
enabled.

3. Because RemoteMediaSessionManagerProxy is a process-wide singleton, it now 
enables
shouldDeactivateAudioSession() itself, and drops a web process's sessions when 
that process
goes away (from WebProcessProxy::shutDown, which runs on both clean teardown 
and crash).
Otherwise the shared session's "became active" state stayed latched on behalf 
of a process
that no longer exists, leaving the session wedged active and preventing later 
processes
from activating.

Activation is attributed to the process that owns the media session; a 
follow-up will attribute it
to the page's top-level frame process (one audio-session proxy per page) so 
multiple
concurrently-playing processes each activate correctly.

Test:
http/tests/site-isolation/audio-session-active.html

* LayoutTests/http/tests/site-isolation/audio-session-active-expected.txt: 
Added.
* LayoutTests/http/tests/site-isolation/audio-session-active.html: Added.
* Source/WebCore/platform/audio/MediaSessionManagerClient.h:
* Source/WebCore/platform/audio/MediaSessionManagerInterface.cpp:
(WebCore::MediaSessionManagerInterface::setClient):
* Source/WebCore/platform/audio/MediaSessionManagerInterface.h:
* Source/WebKit/GPUProcess/GPUProcess.cpp:
(WebKit::GPUProcess::tryToSetAudioSessionActiveForProcess):
* Source/WebKit/GPUProcess/GPUProcess.h:
* Source/WebKit/GPUProcess/GPUProcess.messages.in:
* Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp:
(WebKit::RemoteAudioSessionProxy::configuration):
* Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.h:
* Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.cpp:
(WebKit::RemoteAudioSessionProxyManager::tryToSetActiveForProcess):
*
Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.h:
* Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp:
(WebKit::GPUProcessProxy::tryToSetAudioSessionActiveForProcess):
* Source/WebKit/UIProcess/GPU/GPUProcessProxy.h:
* Source/WebKit/UIProcess/Media/RemoteMediaSessionManagerProxy.cpp:
(WebKit::RemoteMediaSessionManagerProxy::singleton):
(WebKit::RemoteMediaSessionManagerProxy::singletonIfCreated):
(WebKit::RemoteMediaSessionManagerProxy::RemoteMediaSessionManagerProxy):
(WebKit::RemoteMediaSessionManagerProxy::webProcessWillShutDown):
(WebKit::RemoteMediaSessionManagerProxy::tryToSetActiveInternal):
(WebKit::singletonWeakPtr):
* Source/WebKit/UIProcess/Media/RemoteMediaSessionManagerProxy.h:
* Source/WebKit/UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::shutDown):
* Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp:
(WebKit::RemoteAudioSession::configurationChanged):
*
Source/WebKit/WebProcess/GPU/media/RemoteAudioSessionConfiguration.h:
* 
Source/WebKit/WebProcess/GPU/media/RemoteAudioSessionConfiguration.serialization.in:
* Tools/TestWebKitAPI/Tests/WebKit/WKWebView/SiteIsolation.mm:
(TestWebKitAPI::TEST(SiteIsolation, DISABLED_PlayAudioInMultipleFrames)):
(TestWebKitAPI::TEST(SiteIsolation, PlayAudioInMultipleFrames)): Deleted.

Canonical link: 
https://flagged.apple.com:443/proxy?t2=dV6u8Q6Wd4&o=aHR0cHM6Ly9jb21taXRzLndlYmtpdC5vcmcvMzE4MzM3QG1haW4=&emid=70c3e5d6-8c41-4ffd-a363-07a4c7729597&c=11



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications

Reply via email to