Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 267cd2e8c7072fd01bfe053e05c171a4ddbd1e60
https://github.com/WebKit/WebKit/commit/267cd2e8c7072fd01bfe053e05c171a4ddbd1e60
Author: Eric Carlson <[email protected]>
Date: 2026-08-11 (Tue, 11 Aug 2026)
Changed paths:
A
LayoutTests/http/tests/site-isolation/audio-session-active-capture-expected.txt
A LayoutTests/http/tests/site-isolation/audio-session-active-capture.html
M LayoutTests/http/tests/site-isolation/audio-session-active-expected.txt
A
LayoutTests/http/tests/site-isolation/audio-session-active-in-cross-site-iframe-expected.txt
A
LayoutTests/http/tests/site-isolation/audio-session-active-in-cross-site-iframe.html
A
LayoutTests/http/tests/site-isolation/audio-session-active-in-same-site-iframe-expected.txt
A
LayoutTests/http/tests/site-isolation/audio-session-active-in-same-site-iframe.html
A
LayoutTests/http/tests/site-isolation/audio-session-active-replay-expected.txt
A LayoutTests/http/tests/site-isolation/audio-session-active-replay.html
A
LayoutTests/http/tests/site-isolation/audio-session-active-two-pages-expected.txt
A LayoutTests/http/tests/site-isolation/audio-session-active-two-pages.html
A
LayoutTests/http/tests/site-isolation/audio-session-active-video-element-expected.txt
A
LayoutTests/http/tests/site-isolation/audio-session-active-video-element-replay-expected.txt
A
LayoutTests/http/tests/site-isolation/audio-session-active-video-element-replay.html
A
LayoutTests/http/tests/site-isolation/audio-session-active-video-element-two-pages-expected.txt
A
LayoutTests/http/tests/site-isolation/audio-session-active-video-element-two-pages.html
A
LayoutTests/http/tests/site-isolation/audio-session-active-video-element.html
M LayoutTests/http/tests/site-isolation/audio-session-active.html
A
LayoutTests/http/tests/site-isolation/resources/audio-session-active-frame.html
A
LayoutTests/http/tests/site-isolation/resources/report-audio-session-active.html
A
LayoutTests/http/tests/site-isolation/resources/report-video-element-audio-session-active.html
M LayoutTests/media/utilities.js
M Source/WebCore/html/HTMLMediaElement.cpp
M Source/WebCore/platform/audio/MediaSessionManagerInterface.cpp
M Source/WebCore/platform/audio/MediaSessionManagerInterface.h
M Source/WebCore/platform/audio/glib/MediaSessionManagerGLib.cpp
M Source/WebCore/platform/audio/glib/MediaSessionManagerGLib.h
M Source/WebCore/testing/Internals.cpp
M Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp
M Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp
M Source/WebKit/UIProcess/GPU/GPUProcessProxy.h
M Source/WebKit/UIProcess/GPU/GPUProcessProxy.messages.in
M Source/WebKit/UIProcess/Media/RemoteMediaSessionManagerProxy.cpp
M Source/WebKit/UIProcess/Media/RemoteMediaSessionManagerProxy.h
M Source/WebKit/UIProcess/Media/RemoteMediaSessionManagerProxy.messages.in
M Source/WebKit/UIProcess/Media/RemoteMediaSessionProxy.cpp
M Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp
M Source/WebKit/WebProcess/Media/RemoteMediaSessionManager.cpp
M Source/WebKit/WebProcess/Media/RemoteMediaSessionManager.h
Log Message:
-----------
[Site Isolation] Activate the audio session per web process
https://bugs.webkit.org/show_bug.cgi?id=320600
rdar://183573361
Reviewed by Jean-Yves Avenard.
Under site isolation one process-wide RemoteMediaSessionManagerProxy serves
every web
process, but it controlled audio-session activation with a single global
AudioSession. A
second page was denied activation once any page was active, a stop + play raced
the async
deactivation, and a reused web process (same-origin navigation, or a
lingering/stopped
session) kept a stale "active" session so sessionWillBeginPlayback skipped
activating it
even though its real audio session was inactive.
Track activation per web process, and source each web process's real
audio-session state
from the GPU process, which owns it. When a process's audio session becomes
active or
inactive the GPU process pushes that state to the UI process via
GPUProcessProxy::AudioSessionActiveStateChangedForProcess and the proxy applies
it to the
per-process activation entry and to the shared session's active flag before the
activation,
so the decision reflects each process's reality and is never taken from data an
untrusted
web process supplied. Per-process activate/deactivate is serialized, the
forwarded
configuration is completed, a process is deactivated on its last session
removal, and its
per-process activation state is dropped on web-process shutdown (rejecting any
pending
activations).
Make the UI process the single GPU-side activation driver without disabling the
web
process's local activation. The web process still activates its own AudioSession
optimistically -- so getUserMedia's activation wait, the DOM audio-session
state, and
process-suspend deactivation keep working -- but under site isolation
RemoteAudioSession no
longer sends TryToSetActive to the GPU process: it resolves the request locally
and the
UI-process proxy owns the GPU-side decision, so the two never race.
RemoteMediaSessionProxy::updateState
re-evaluates activation for a session when its state changes (WebAudio becomes
audible only
after playback begins, so the begin-time gate can't catch it), targeting that
session's
process, and updateMediaSessionStates activates a process while it has active
audio-capture
sources -- the UI process can't use activeAudioSessionRequired() for capture,
since the
capture sources live in the web process and only their count is forwarded.
When a web process suspends it can no longer release the shared session through
the GPU
itself, so RemoteMediaSessionManager forwards
processWillSuspend/processDidResume to the
proxy, which releases that process's GPU session on suspend and re-acquires it
on resume
when the process still requires it.
Route the tests' reset-to-consistent-state through the manager too. Internals
reached past
the MediaSessionManager to deactivate AudioSession directly between tests;
under site
isolation that made the web process yet another uncoordinated driver, racing
the per-process
activation chain across iterations and flaking the stress tests. Move that
logic into
MediaSessionManagerInterface::resetToConsistentStateForTesting() -- with the
GPU-side gate
now in RemoteAudioSession, that reset no longer reaches the GPU under site
isolation. The
now-unused RemoteMediaSessionManager::tryToSetAudioSessionActive is removed.
Tests: http/tests/site-isolation/audio-session-active-capture.html
http/tests/site-isolation/audio-session-active-in-cross-site-iframe.html
http/tests/site-isolation/audio-session-active-in-same-site-iframe.html
http/tests/site-isolation/audio-session-active-replay.html
http/tests/site-isolation/audio-session-active-two-pages.html
http/tests/site-isolation/audio-session-active-video-element-replay.html
http/tests/site-isolation/audio-session-active-video-element-two-pages.html
http/tests/site-isolation/audio-session-active-video-element.html
*
LayoutTests/http/tests/site-isolation/audio-session-active-in-cross-site-iframe-expected.txt:
Added.
*
LayoutTests/http/tests/site-isolation/audio-session-active-in-cross-site-iframe.html:
Added.
*
LayoutTests/http/tests/site-isolation/audio-session-active-in-same-site-iframe-expected.txt:
Added.
*
LayoutTests/http/tests/site-isolation/audio-session-active-in-same-site-iframe.html:
Added.
*
LayoutTests/http/tests/site-isolation/audio-session-active-replay-expected.txt:
Added.
* LayoutTests/http/tests/site-isolation/audio-session-active-replay.html: Added.
*
LayoutTests/http/tests/site-isolation/audio-session-active-two-pages-expected.txt:
Added.
* LayoutTests/http/tests/site-isolation/audio-session-active-two-pages.html:
Added.
*
LayoutTests/http/tests/site-isolation/audio-session-active-video-element-expected.txt:
Added.
*
LayoutTests/http/tests/site-isolation/audio-session-active-video-element-replay-expected.txt:
Added.
*
LayoutTests/http/tests/site-isolation/audio-session-active-video-element-replay.html:
Added.
*
LayoutTests/http/tests/site-isolation/audio-session-active-video-element-two-pages-expected.txt:
Added.
*
LayoutTests/http/tests/site-isolation/audio-session-active-video-element-two-pages.html:
Added.
*
LayoutTests/http/tests/site-isolation/audio-session-active-video-element.html:
Added.
* LayoutTests/http/tests/site-isolation/audio-session-active.html:
*
LayoutTests/http/tests/site-isolation/resources/audio-session-active-frame.html:
Added.
*
LayoutTests/http/tests/site-isolation/resources/report-audio-session-active.html:
Added.
*
LayoutTests/http/tests/site-isolation/resources/report-video-element-audio-session-active.html:
Added.
* Source/WebCore/html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::couldPlayIfEnoughData const):
* Source/WebCore/platform/audio/MediaSessionManagerInterface.cpp:
(WebCore::MediaSessionManagerInterface::hasActiveAudioSession const):
(WebCore::MediaSessionManagerInterface::sessionWillBeginPlayback):
(WebCore::MediaSessionManagerInterface::maybeDeactivateAudioSession):
(WebCore::MediaSessionManagerInterface::removeSession):
(WebCore::MediaSessionManagerInterface::maybeActivateAudioSession):
(WebCore::MediaSessionManagerInterface::managesAudioSessionActivation):
(WebCore::MediaSessionManagerInterface::audioCaptureSourceStateChanged):
(WebCore::MediaSessionManagerInterface::resetToConsistentStateForTesting):
* Source/WebCore/platform/audio/MediaSessionManagerInterface.h:
* Source/WebKit/UIProcess/Media/RemoteMediaSessionManagerProxy.cpp:
(WebKit::RemoteMediaSessionManagerProxy::removeMediaSession):
(WebKit::RemoteMediaSessionManagerProxy::webProcessWillShutDown):
(WebKit::RemoteMediaSessionManagerProxy::setCurrentSession):
(WebKit::RemoteMediaSessionManagerProxy::mediaSessionWillBeginPlayback):
(WebKit::RemoteMediaSessionManagerProxy::remoteAudioConfigurationChanged):
(WebKit::RemoteMediaSessionManagerProxy::hasActiveAudioSession const):
(WebKit::RemoteMediaSessionManagerProxy::processForSession const):
(WebKit::RemoteMediaSessionManagerProxy::enqueueAudioSessionActivation):
(WebKit::RemoteMediaSessionManagerProxy::deactivateAllAudioSessions):
(WebKit::RemoteMediaSessionManagerProxy::sendNextActivationIPC):
(WebKit::RemoteMediaSessionManagerProxy::setAudioSessionActiveForProcess):
(WebKit::RemoteMediaSessionManagerProxy::reevaluateAudioSessionActivation):
(WebKit::RemoteMediaSessionManagerProxy::updateMediaSessionStates):
(WebKit::RemoteMediaSessionManagerProxy::processRequiresAudioSession const):
(WebKit::RemoteMediaSessionManagerProxy::remoteProcessWillSuspend):
(WebKit::RemoteMediaSessionManagerProxy::remoteProcessDidResume):
* Source/WebKit/UIProcess/Media/RemoteMediaSessionManagerProxy.h:
* Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp:
(WebKit::RemoteAudioSession::configurationChanged):
(WebKit::RemoteAudioSession::sendNextActivationIPC):
(WebKit::RemoteAudioSession::tryToSetActiveInternal):
(WebKit::RemoteAudioSession::gpuProcessConnectionDidClose):
* Source/WebKit/WebProcess/Media/RemoteMediaSessionManager.cpp:
(WebKit::RemoteMediaSessionManager::RemoteMediaSessionManager):
(WebKit::RemoteMediaSessionManager::sessionWillBeginPlayback):
(WebKit::RemoteMediaSessionManager::setAudioSessionPreferredBufferSize):
(WebKit::RemoteMediaSessionManager::tryToSetAudioSessionActive): Deleted.
(WebKit::RemoteMediaSessionManager::processWillSuspend):
(WebKit::RemoteMediaSessionManager::processDidResume):
* LayoutTests/media/utilities.js:
(playIgnoringAbort):
(async startNearSilentAudioContext):
(async waitForAudioSessionActiveState):
(waitForAudioSessionActiveState):
* Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp:
(WebKit::RemoteAudioSessionProxy::tryToSetActive):
* Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp:
(WebKit::GPUProcessProxy::audioSessionActiveStateChangedForProcess):
* Source/WebKit/UIProcess/GPU/GPUProcessProxy.h:
* Source/WebKit/UIProcess/GPU/GPUProcessProxy.messages.in:
* Source/WebKit/UIProcess/Media/RemoteMediaSessionProxy.cpp:
(WebKit::RemoteMediaSessionProxy::updateState):
* Source/WebKit/WebProcess/Media/RemoteMediaSessionManager.h:
*
LayoutTests/http/tests/site-isolation/audio-session-active-capture-expected.txt:
Added.
* LayoutTests/http/tests/site-isolation/audio-session-active-capture.html:
Added.
* Source/WebCore/platform/audio/glib/MediaSessionManagerGLib.cpp:
(WebCore::MediaSessionManagerGLib::resetToConsistentStateForTesting):
* Source/WebCore/platform/audio/glib/MediaSessionManagerGLib.h:
* Source/WebCore/testing/Internals.cpp:
(WebCore::Internals::resetToConsistentState):
* LayoutTests/http/tests/site-isolation/audio-session-active-expected.txt:
* Source/WebKit/UIProcess/Media/RemoteMediaSessionManagerProxy.messages.in:
Canonical link: https://commits.webkit.org/319006@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications