Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: eb3b9e5da4bf56f686b31ba80f1751b7aab8f433
https://github.com/WebKit/WebKit/commit/eb3b9e5da4bf56f686b31ba80f1751b7aab8f433
Author: Jer Noble <[email protected]>
Date: 2026-01-26 (Mon, 26 Jan 2026)
Changed paths:
M LayoutTests/ipc/cfnetwork-crashes-with-string-to-string-http-headers.html
M LayoutTests/ipc/dictionary-callbacks.html
M LayoutTests/ipc/dispatched-from-to-exposed-to-ipc-testing-api.html
M LayoutTests/ipc/isasyncreply-exposed-to-ipc-testing-api.html
M LayoutTests/ipc/replyarguments-exposed-to-ipc-testing-api.html
M LayoutTests/ipc/url-requestPriority-out-of-range.html
M Source/WebCore/loader/MediaResourceLoader.cpp
M Source/WebCore/loader/MediaResourceLoader.h
M Source/WebCore/loader/cache/CachedResourceLoader.cpp
M Source/WebCore/platform/graphics/MediaPlayer.cpp
M Source/WebCore/platform/graphics/PlatformMediaResourceLoader.h
M
Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h
M
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h
M
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm
M
Source/WebCore/platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.h
M
Source/WebCore/platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.mm
M Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm
M Source/WebKit/CMakeLists.txt
M Source/WebKit/DerivedSources-input.xcfilelist
M Source/WebKit/DerivedSources-output.xcfilelist
M Source/WebKit/DerivedSources.make
M Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp
M Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h
M Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp
M Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h
M Source/WebKit/GPUProcess/media/RemoteMediaResource.cpp
M Source/WebKit/GPUProcess/media/RemoteMediaResource.h
M Source/WebKit/GPUProcess/media/RemoteMediaResourceIdentifier.h
M Source/WebKit/GPUProcess/media/RemoteMediaResourceLoader.cpp
M Source/WebKit/GPUProcess/media/RemoteMediaResourceLoader.h
A Source/WebKit/GPUProcess/media/RemoteMediaResourceLoader.messages.in
A Source/WebKit/GPUProcess/media/RemoteMediaResourceLoaderIdentifier.h
R Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.cpp
R Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.h
R Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.messages.in
M Source/WebKit/Scripts/webkit/messages.py
M Source/WebKit/Scripts/webkit/opaque_ipc_types.tracking.in
M Source/WebKit/Scripts/webkit/tests/MessageArgumentDescriptions.cpp
M Source/WebKit/Shared/WTFArgumentCoders.serialization.in
M Source/WebKit/Sources.txt
M Source/WebKit/SourcesCocoa.txt
M Source/WebKit/WebKit.xcodeproj/project.pbxproj
M Source/WebKit/WebProcess/GPU/media/AudioVideoRendererRemote.cpp
M Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp
M Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h
M Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.messages.in
A Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceLoaderProxy.cpp
A Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceLoaderProxy.h
A
Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceLoaderProxy.messages.in
M Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.cpp
M Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.h
Log Message:
-----------
[Cocoa] Enable entireLengthAvailableOnDemand=YES path for Blob URLs in
WebCoreAVFResourceLoader
rdar://168546299
https://bugs.webkit.org/show_bug.cgi?id=306008
Reviewed by Andy Estes.
When entireLengthAvailableOnDemand is set to YES, AVFoundation can bypass all
caching and read-ahead of the requested URL and simply ask the delegate to load
only the media data required for playback, as that media data is required. This
is a significant performance improvement; however, it can lead to deadlocks as
property requests on the main thread are blocked against loading media data to
resolve those requests, and media data must be loaded on the main thread.
Break this deadlock behavior and re-enable entireLengthAvailableOnDemand=YES by
allowing all WebCoreAVFResourceLoaders in the GPU process to run entirely on
background work queues.(Allowing the MediaResourceLoader in the WebContent
process to run on a background work queue is out of scope.)
First, replace RemoteMediaResourceManager with a independent XPC object and
proxy object: RemoteMediaResourceLoader/Proxy. Each object receives incoming
messages on background work queues. RemoteMediaResourceProxy in the WebContent
process sends messages via the RemoteMediaResourceLoaderProxy rather than
dispatching those messages itself.
Second, requests are no longer serviced by RemoteMediaPlayerPrivate. Instead the
media player only creates the RemoteMediaResourceLoader, and that loader
services requests. By removing MediaPlayer from the path of loading, that
loading no longer is bound to the main thread.
Third, MediaPlayerPrivateAVFoundationObjC no longer dispatches to the main
thread in order to respond to delegate requests
for -shouldWaitForLoadingOfResource:. By creating the MediaResourceLoader up
front during initial creation of the player, that loader can be referenced in
the delegate callback queue, bypassing the main thread and responding
immediately without blocking. Only those schemes which must be responded to
explicitly through MediaPlayer (such as encrytped key request schemes) are
dispatched to the main thread.
And finally, to avoid having multiple base classes implement reference counting,
make PlatformMediaResourceLoader–itself an abstract base
class–AbstractThreadSafe
RefCountedAndCanMakeWeakPtr, rather than have a concrete ref count itself. This
allows classes which inherit from a concrete ref counted class to also conform
to PlatformMediaResourceLoader.
No new tests, as this patch has no behavioral changes; just performance
improvements.
Drive-by fixes:
- Make DataURLResourceMediaLoader operate on a background queue
so as not to block the loader queue.
- -[WebCoreNSURLSession resume] doesn't need to dispatch to the
main thread now that its loader works on a background queue.
* Source/WebCore/loader/MediaResourceLoader.cpp:
(WebCore::MediaResourceLoader::sendH2Ping):
(WebCore::MediaResourceLoader::requestResource):
* Source/WebCore/loader/MediaResourceLoader.h:
* Source/WebCore/loader/cache/CachedResourceLoader.cpp:
(WebCore::CachedResourceLoader::requestResource):
* Source/WebCore/platform/graphics/MediaPlayer.cpp:
* Source/WebCore/platform/graphics/PlatformMediaResourceLoader.h:
*
Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h:
*
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
*
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::MediaPlayerPrivateAVFoundationObjC::MediaPlayerPrivateAVFoundationObjC):
(WebCore::MediaPlayerPrivateAVFoundationObjC::~MediaPlayerPrivateAVFoundationObjC):
(WebCore::MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL):
(WebCore::MediaPlayerPrivateAVFoundationObjC::shouldWaitForLoadingOfResource):
(WebCore::MediaPlayerPrivateAVFoundationObjC::didCancelLoadingRequest):
(WebCore::MediaPlayerPrivateAVFoundationObjC::didStopLoadingRequest):
(WebCore::MediaPlayerPrivateAVFoundationObjC::ensureAVFResourceLoader):
(WebCore::MediaPlayerPrivateAVFoundationObjC::forEachResourceLoader const):
(WebCore::MediaPlayerPrivateAVFoundationObjC::addResourceLoader):
(WebCore::MediaPlayerPrivateAVFoundationObjC::getResourceLoader const):
(WebCore::MediaPlayerPrivateAVFoundationObjC::takeResourceLoader):
(-[WebCoreAVFLoaderDelegate
resourceLoader:shouldWaitForLoadingOfRequestedResource:]):
* Source/WebCore/platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.h:
(WebCore::WebCoreAVFResourceLoader::setLogIdentifier):
(WebCore::WebCoreAVFResourceLoader::logIdentifier const):
(WebCore::WebCoreAVFResourceLoader::logger const):
(WebCore::WebCoreAVFResourceLoader::protectedLogger const):
(WebCore::WebCoreAVFResourceLoader::logClassName const):
*
Source/WebCore/platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.mm:
(WebCore::DataURLResourceMediaLoader::create):
(WebCore::DataURLResourceMediaLoader::decodeQueue):
(WebCore::DataURLResourceMediaLoader::DataURLResourceMediaLoader):
(WebCore::DataURLResourceMediaLoader::handleDecodeResult):
(WebCore::WebCoreAVFResourceLoader::create):
(WebCore::WebCoreAVFResourceLoader::WebCoreAVFResourceLoader):
(WebCore::WebCoreAVFResourceLoader::startLoading):
(WebCore::WebCoreAVFResourceLoader::stopLoading):
(WebCore::WebCoreAVFResourceLoader::responseReceived):
(WebCore::WebCoreAVFResourceLoader::loadFailed):
(WebCore::WebCoreAVFResourceLoader::loadFinished):
(WebCore::WebCoreAVFResourceLoader::logChannel const):
* Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm:
(-[WebCoreNSURLSessionDataTask resume]):
* Source/WebKit/CMakeLists.txt:
* Source/WebKit/DerivedSources-input.xcfilelist:
* Source/WebKit/DerivedSources-output.xcfilelist:
* Source/WebKit/DerivedSources.make:
* Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp:
(WebKit::GPUConnectionToWebProcess::didClose):
(WebKit::GPUConnectionToWebProcess::protectedRemoteAudioDestinationManager):
(WebKit::GPUConnectionToWebProcess::remoteMediaResourceManager): Deleted.
(WebKit::GPUConnectionToWebProcess::protectedRemoteMediaResourceManager):
Deleted.
* Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h:
* Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp:
(WebKit::RemoteMediaPlayerProxy::mediaPlayerCreateResourceLoader):
(WebKit::RemoteMediaPlayerProxy::destroyResourceLoader):
(WebKit::RemoteMediaPlayerProxy::requestResource): Deleted.
(WebKit::RemoteMediaPlayerProxy::sendH2Ping): Deleted.
(WebKit::RemoteMediaPlayerProxy::removeResource): Deleted.
* Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h:
* Source/WebKit/GPUProcess/media/RemoteMediaResource.cpp:
(WebKit::RemoteMediaResource::create):
(WebKit::RemoteMediaResource::RemoteMediaResource):
(WebKit::RemoteMediaResource::shutdown):
* Source/WebKit/GPUProcess/media/RemoteMediaResource.h:
* Source/WebKit/GPUProcess/media/RemoteMediaResourceIdentifier.h:
* Source/WebKit/GPUProcess/media/RemoteMediaResourceLoader.cpp:
(WebKit::RemoteMediaResourceLoader::create):
(WebKit::RemoteMediaResourceLoader::RemoteMediaResourceLoader):
(WebKit::RemoteMediaResourceLoader::~RemoteMediaResourceLoader):
(WebKit::RemoteMediaResourceLoader::initializeConnection):
(WebKit::RemoteMediaResourceLoader::requestResource):
(WebKit::RemoteMediaResourceLoader::sendH2Ping):
(WebKit::RemoteMediaResourceLoader::addMediaResource):
(WebKit::RemoteMediaResourceLoader::removeMediaResource):
(WebKit::RemoteMediaResourceLoader::resourceForId):
(WebKit::RemoteMediaResourceLoader::responseReceived):
(WebKit::RemoteMediaResourceLoader::redirectReceived):
(WebKit::RemoteMediaResourceLoader::dataSent):
(WebKit::RemoteMediaResourceLoader::dataReceived):
(WebKit::RemoteMediaResourceLoader::accessControlCheckFailed):
* Source/WebKit/GPUProcess/media/RemoteMediaResourceLoader.h:
* Source/WebKit/GPUProcess/media/RemoteMediaResourceLoader.messages.in: Renamed
from Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.messages.in.
* Source/WebKit/GPUProcess/media/RemoteMediaResourceLoaderIdentifier.h: Copied
from Source/WebKit/GPUProcess/media/RemoteMediaResourceIdentifier.h.
* Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.cpp: Removed.
* Source/WebKit/Scripts/webkit/messages.py:
(atomic_object_identifier):
(serialized_identifiers):
(types_that_cannot_be_forward_declared):
(conditions_for_header):
* Source/WebKit/Scripts/webkit/opaque_ipc_types.tracking.in:
* Source/WebKit/Scripts/webkit/tests/MessageArgumentDescriptions.cpp:
(IPC::serializedIdentifiers):
* Source/WebKit/Shared/WTFArgumentCoders.serialization.in:
* Source/WebKit/Sources.txt:
* Source/WebKit/SourcesCocoa.txt:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Source/WebKit/WebProcess/GPU/media/AudioVideoRendererRemote.cpp:
* Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp:
(WebKit::MediaPlayerPrivateRemote::createResourceLoader):
(WebKit::MediaPlayerPrivateRemote::destroyResourceLoader):
(WebKit::MediaPlayerPrivateRemote::requestResource): Deleted.
(WebKit::MediaPlayerPrivateRemote::sendH2Ping): Deleted.
(WebKit::MediaPlayerPrivateRemote::removeResource): Deleted.
* Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h:
* Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.messages.in:
* Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceLoaderProxy.cpp: Added.
(WebKit::RemoteMediaResourceLoaderProxy::create):
(WebKit::RemoteMediaResourceLoaderProxy::RemoteMediaResourceLoaderProxy):
(WebKit::RemoteMediaResourceLoaderProxy::~RemoteMediaResourceLoaderProxy):
(WebKit::RemoteMediaResourceLoaderProxy::initializeConnection):
(WebKit::RemoteMediaResourceLoaderProxy::requestResource):
(WebKit::RemoteMediaResourceLoaderProxy::sendH2Ping):
(WebKit::RemoteMediaResourceLoaderProxy::removeResource):
(WebKit::RemoteMediaResourceLoaderProxy::responseReceived):
(WebKit::RemoteMediaResourceLoaderProxy::redirectReceived):
(WebKit::RemoteMediaResourceLoaderProxy::dataSent):
(WebKit::RemoteMediaResourceLoaderProxy::dataReceived):
(WebKit::RemoteMediaResourceLoaderProxy::accessControlCheckFailed):
(WebKit::RemoteMediaResourceLoaderProxy::loadFailed):
(WebKit::RemoteMediaResourceLoaderProxy::loadFinished):
* Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceLoaderProxy.h: Renamed
from Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.h.
*
Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceLoaderProxy.messages.in:
Copied from Source/WebKit/GPUProcess/media/RemoteMediaResourceIdentifier.h.
* Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.cpp:
(WebKit::RemoteMediaResourceProxy::RemoteMediaResourceProxy):
(WebKit::RemoteMediaResourceProxy::responseReceived):
(WebKit::RemoteMediaResourceProxy::redirectReceived):
(WebKit::RemoteMediaResourceProxy::dataSent):
(WebKit::RemoteMediaResourceProxy::dataReceived):
(WebKit::RemoteMediaResourceProxy::accessControlCheckFailed):
(WebKit::RemoteMediaResourceProxy::loadFailed):
(WebKit::RemoteMediaResourceProxy::loadFinished):
* Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.h:
Canonical link: https://commits.webkit.org/306230@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications