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

Reply via email to