Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 5ba0022932fe7497c614dca03712cc2d9a7c621d
      
https://github.com/WebKit/WebKit/commit/5ba0022932fe7497c614dca03712cc2d9a7c621d
  Author: Eric Carlson <[email protected]>
  Date:   2026-07-01 (Wed, 01 Jul 2026)

  Changed paths:
    M 
LayoutTests/media/picture-in-picture/video-playback-system-interruption-and-resume-expected.txt
    M 
LayoutTests/media/picture-in-picture/video-playback-system-interruption-and-resume.html
    M LayoutTests/media/video-currenttime-monotonic.html
    M LayoutTests/media/video-seek-after-end-play-expected.txt
    A LayoutTests/platform/glib/media/video-seek-after-end-play-expected.txt
    M LayoutTests/platform/mac-site-isolation/TestExpectations
    M Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml
    M Source/WebCore/Modules/audiosession/DOMAudioSession.cpp
    M Source/WebCore/Modules/mediastream/UserMediaRequest.cpp
    M Source/WebCore/Modules/webaudio/AudioContext.cpp
    M Source/WebCore/Modules/webaudio/BaseAudioContext.h
    M Source/WebCore/html/HTMLMediaElement.cpp
    M Source/WebCore/html/HTMLMediaElement.h
    M Source/WebCore/platform/audio/AudioSession.cpp
    M Source/WebCore/platform/audio/AudioSession.h
    M Source/WebCore/platform/audio/MediaSessionManagerInterface.cpp
    M Source/WebCore/platform/audio/MediaSessionManagerInterface.h
    M Source/WebCore/platform/audio/PlatformMediaSession.cpp
    M Source/WebCore/platform/audio/cocoa/AudioSessionCocoa.h
    M Source/WebCore/platform/audio/cocoa/AudioSessionCocoa.mm
    M Source/WebCore/testing/Internals.cpp
    M Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp
    M Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.h
    M Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.messages.in
    M Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.cpp
    M Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.h
    M Source/WebKit/GPUProcess/webrtc/UserMediaCaptureManagerProxy.cpp
    M Source/WebKit/UIProcess/Media/RemoteMediaSessionManagerProxy.cpp
    M Source/WebKit/UIProcess/Media/RemoteMediaSessionManagerProxy.h
    M Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp
    M Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.h
    M Source/WebKit/WebProcess/Media/RemoteMediaSessionManager.cpp
    M Tools/TestWebKitAPI/Tests/WebKit/WKWebView/MediaSession.mm

  Log Message:
  -----------
  [Site isolation] Make AudioSession activation asynchronous
https://bugs.webkit.org/show_bug.cgi?id=308155
rdar://170662797

Reviewed by Youenn Fablet and Jer Noble.

`AudioSession::tryToSetActive(bool)` now returns
`Ref<SetActivePromise>` instead of a synchronous `bool`. This is
a prerequisite for moving the media session manager completely out of
the WebContent process under site isolation: the existing sync IPC from
WebContent to the GPU process that confirmed audio session activation
cannot be extended to an additional UI-process hop without making the
entire chain async.

The `TryToSetActive` IPC message is now reply-with-promise rather than
synchronous, so `RemoteAudioSession::tryToSetActiveInternal()` no
longer blocks the WebContent main thread on a GPU round-trip.
`MediaSessionManagerInterface::sessionWillBeginPlayback()` is
restructured: when activation is already in place it takes the
fast synchronous path and fires its completion handler inline; when
activation is required it chains the completion handler off the
activation promise via `whenSettled()`.

`MediaSessionManagerInterface::maybeActivateAudioSession()` returns
its own promise, and gives each concurrent caller its own
`GenericPromise::Producer` (held in `m_activationWaiters`) so multiple
callers can chain off a single in-flight activation. The producers are
settled together when the underlying `tryToSetActive(true)` completes.

`RemoteAudioSession::tryToSetActiveInternal()` keeps at most one IPC
in flight at a time using a FIFO chain (`m_pendingActivationChain`).
Consecutive same-state requests coalesce against the tail of the
chain into a single IPC; alternating-state requests append a new
entry that is dispatched when the previous reply arrives. Serializing
at this layer preserves request ordering independently of how
`AudioSessionCocoa::tryToSetActiveInternal()` is implemented, which
matters once activation there becomes truly non-blocking.

`AudioSessionCocoa::tryToSetActiveInternal()` activation still uses
`dispatchSync` internally; only deactivation is fully async at this
layer for now. The promise infrastructure is in place to make
activation non-blocking in a follow-up change.

Add an AsyncAudioSessionActivationEnabled runtime preference (default true). 
When this
preference is false it makes the IPC to the GPU process synchronous, to make it 
easier to
test if regressions are caused by the change to async IPC or by the change to 
using
NativePromise in the AudioSession activation code path.

Fix a pre-existing clearInterval(checkCurrentTime) bug in 
video-currenttime-monotonic.html
that caused spurious "time went backward" failures when the interval kept 
running across
video-end boundaries.

No change in observable behavior. Covered by existing tests.

* 
LayoutTests/media/picture-in-picture/video-playback-system-interruption-and-resume-expected.txt:
* 
LayoutTests/media/picture-in-picture/video-playback-system-interruption-and-resume.html:
* LayoutTests/media/video-currenttime-monotonic.html:
* LayoutTests/media/video-seek-after-end-play-expected.txt:
* LayoutTests/platform/glib/media/video-seek-after-end-play-expected.txt: 
Copied from LayoutTests/media/video-seek-after-end-play-expected.txt.
* LayoutTests/platform/mac-site-isolation/TestExpectations:
* Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml:
* Source/WebCore/Modules/audiosession/DOMAudioSession.cpp:
(WebCore::DOMAudioSession::scheduleStateChangeEvent):
* Source/WebCore/Modules/mediastream/UserMediaRequest.cpp:
(WebCore::UserMediaRequest::allow):
* Source/WebCore/Modules/webaudio/AudioContext.cpp:
(WebCore::AudioContext::close):
(WebCore::AudioContext::suspendRendering):
(WebCore::AudioContext::resumeRendering):
(WebCore::AudioContext::startRendering):
(WebCore::AudioContext::lazyInitialize):
(WebCore::AudioContext::mayResumePlayback):
(WebCore::AudioContext::suspendPlayback):
* Source/WebCore/Modules/webaudio/BaseAudioContext.h:
(WebCore::BaseAudioContext::isRunning const):
* Source/WebCore/html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::load):
(WebCore::HTMLMediaElement::prepareForLoad):
(WebCore::HTMLMediaElement::selectMediaResource):
(WebCore::HTMLMediaElement::completePlayInternal):
(WebCore::HTMLMediaElement::playInternal):
(WebCore::HTMLMediaElement::pauseInternal):
* Source/WebCore/html/HTMLMediaElement.h:
* Source/WebCore/platform/audio/AudioSession.cpp:
(WebCore::AudioSession::tryToSetActive):
(WebCore::AudioSession::tryToSetActiveInternal):
* Source/WebCore/platform/audio/AudioSession.h:
* Source/WebCore/platform/audio/MediaSessionManagerInterface.cpp:
(WebCore::MediaSessionManagerInterface::sessionWillBeginPlayback):
(WebCore::MediaSessionManagerInterface::enforceConcurrentPlaybackRestriction):
(WebCore::MediaSessionManagerInterface::maybeDeactivateAudioSession):
(WebCore::MediaSessionManagerInterface::maybeActivateAudioSession):
* Source/WebCore/platform/audio/MediaSessionManagerInterface.h:
* Source/WebCore/platform/audio/PlatformMediaSession.cpp:
(WebCore::PlatformMediaSession::clientWillBeginPlayback):
(WebCore::PlatformMediaSession::processClientWillPausePlayback):
(WebCore::PlatformMediaSession::canProduceAudioChanged):
* Source/WebCore/platform/audio/cocoa/AudioSessionCocoa.h:
* Source/WebCore/platform/audio/cocoa/AudioSessionCocoa.mm:
(WebCore::AudioSessionCocoa::tryToSetActiveInternal):
* Source/WebCore/testing/Internals.cpp:
(WebCore::Internals::resetToConsistentState):
* Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp:
(WebKit::RemoteAudioSessionProxy::tryToSetActive):
(WebKit::RemoteAudioSessionProxy::tryToSetActiveSync):
* Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.h:
* Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.messages.in:
* Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.cpp:
(WebKit::RemoteAudioSessionProxyManager::tryToSetActiveForProcess):
* Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.h:
* Source/WebKit/GPUProcess/webrtc/UserMediaCaptureManagerProxy.cpp:
* Source/WebKit/UIProcess/Media/RemoteMediaSessionManagerProxy.cpp:
(WebKit::RemoteMediaSessionManagerProxy::tryToSetActiveInternal):
* Source/WebKit/UIProcess/Media/RemoteMediaSessionManagerProxy.h:
* Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp:
(WebKit::RemoteAudioSession::tryToSetActiveInternal):
(WebKit::RemoteAudioSession::sendNextActivationIPC):
* Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.h:
* Source/WebKit/WebProcess/Media/RemoteMediaSessionManager.cpp:
(WebKit::RemoteMediaSessionManager::tryToSetAudioSessionActive):
* Tools/TestWebKitAPI/Tests/WebKit/WKWebView/MediaSession.mm:
(TestWebKitAPI::MediaSessionTest::loadPageAndBecomeNowPlaying):

Canonical link: https://commits.webkit.org/316303@main



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

Reply via email to