Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 92b20012526ca4ecdc3254fc5d8101a7221357d3
https://github.com/WebKit/WebKit/commit/92b20012526ca4ecdc3254fc5d8101a7221357d3
Author: Jean-Yves Avenard <[email protected]>
Date: 2026-09-21 (Mon, 21 Sep 2026)
Changed paths:
A
LayoutTests/http/wpt/webcodecs/transfer-non-detachable-buffer.any-expected.txt
A LayoutTests/http/wpt/webcodecs/transfer-non-detachable-buffer.any.html
A LayoutTests/http/wpt/webcodecs/transfer-non-detachable-buffer.any.js
A
LayoutTests/http/wpt/webcodecs/transfer-non-detachable-buffer.any.worker-expected.txt
A
LayoutTests/http/wpt/webcodecs/transfer-non-detachable-buffer.any.worker.html
M
LayoutTests/imported/w3c/web-platform-tests/webcodecs/transfering.https.any-expected.txt
M
LayoutTests/imported/w3c/web-platform-tests/webcodecs/transfering.https.any.worker-expected.txt
M Source/WebCore/Headers.cmake
M Source/WebCore/Modules/webcodecs/WebCodecsAudioData.cpp
M Source/WebCore/Modules/webcodecs/WebCodecsAudioData.h
M Source/WebCore/Modules/webcodecs/WebCodecsAudioData.idl
M Source/WebCore/Modules/webcodecs/WebCodecsAudioEncoder.cpp
A Source/WebCore/Modules/webcodecs/WebCodecsBufferTransfer.cpp
A Source/WebCore/Modules/webcodecs/WebCodecsBufferTransfer.h
M Source/WebCore/Modules/webcodecs/WebCodecsEncodedAudioChunk.cpp
M Source/WebCore/Modules/webcodecs/WebCodecsEncodedAudioChunk.h
M Source/WebCore/Modules/webcodecs/WebCodecsEncodedAudioChunk.idl
M Source/WebCore/Modules/webcodecs/WebCodecsEncodedAudioChunkData.h
M Source/WebCore/Modules/webcodecs/WebCodecsEncodedVideoChunk.cpp
M Source/WebCore/Modules/webcodecs/WebCodecsEncodedVideoChunk.h
M Source/WebCore/Modules/webcodecs/WebCodecsEncodedVideoChunk.idl
M Source/WebCore/Modules/webcodecs/WebCodecsEncodedVideoChunkData.h
M Source/WebCore/Modules/webcodecs/WebCodecsImageDecoder.cpp
M Source/WebCore/Modules/webcodecs/WebCodecsImageDecoder.h
M Source/WebCore/Modules/webcodecs/WebCodecsImageDecoder.idl
M Source/WebCore/Modules/webcodecs/WebCodecsVideoEncoder.cpp
M Source/WebCore/Modules/webcodecs/WebCodecsVideoFrame.cpp
M Source/WebCore/Modules/webcodecs/WebCodecsVideoFrame.h
M Source/WebCore/Modules/webcodecs/WebCodecsVideoFrame.idl
M Source/WebCore/Sources.txt
M Source/WebCore/WebCore.xcodeproj/project.pbxproj
M Source/WebCore/platform/SharedBuffer.cpp
M Source/WebCore/platform/SharedBuffer.h
M Source/WebKit/Scripts/webkit/opaque_ipc_types.tracking.in
M Source/WebKit/Shared/WebCoreArgumentCodersMedia.serialization.in
M Tools/TestWebKitAPI/CMakeLists.txt
M Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
A Tools/TestWebKitAPI/Tests/WebCore/WebCodecsBufferTransfer.cpp
Log Message:
-----------
Adopt WebCodecs init.transfer
https://bugs.webkit.org/show_bug.cgi?id=324603
rdar://187834056
Reviewed by Youenn Fablet.
EncodedAudioChunkInit, EncodedVideoChunkInit, AudioDataInit,
VideoFrameBufferInit
and ImageDecoderInit did not have the transfer member, so a page could not hand
ownership of its ArrayBuffers to these objects: the constructors always copied
init.data, and the page's buffers stayed alive afterwards holding it a second
time.
Data in WebCodecsEncodedAudioChunk and WebCodecsEncodedVideoChunk was stored in
a Vector<uint8_t> which didn't allow for JS data to be moved into.
So data was copied from JSC::SharedBuffer into
WebCodecsEncoded{Audio,Video}Chunk
and again into the encoder or decoder own's buffers.
We amend the related idl files to have the spec mandated sequence<ArrayBuffer>
transfer.
The ArrayBuffer's data is then moved into a SharedBuffer instead of being copied
into a Vector and passed around without a need to copy.
We amend DataSegment variant to accept an ArrayBufferContents to ease
wrapping the content into a SharedBuffer. We specifically don't use
DataSegment::Provider
so that in a follow-up change we can detect what content type the SharedBuffer
is using.
We have the SharedBuffer store an ArrayBufferContent instead of the
JSC::ArrayBuffer
due to ArrayBuffer lack of thread-safe refcounting and we don't want to
modify JSC for this.
While ArrayBufferContent is a using a gigacage allocated buffer, its usage
for our purpose is safe as it's both immutable and gigacage allocation/free
is thread-safe.
Following this change, the ArrayBuffer copy is removed when creating
the WebCodecsEncodedChunk.
However, AudioData and VideoFrame while they are validated like the spec
required and detached, we still perform a copy due to how the
PlatformRawAudioData
and VideoFrame works.
They currently take a span that forces a copy.
We will amend those classes to take a Ref<SharedBuffer> in a followup
change.
Test expectations are amended for tests that are now passing, adding API
tests to actually check the data is moved rather than copied.
Added tests to check that non detachable arrays will cause the code to throw as
required.
*
LayoutTests/http/wpt/webcodecs/transfer-non-detachable-buffer.any-expected.txt:
Added.
* LayoutTests/http/wpt/webcodecs/transfer-non-detachable-buffer.any.html: Added.
* LayoutTests/http/wpt/webcodecs/transfer-non-detachable-buffer.any.js: Added.
(nonDetachableBuffer):
(test):
*
LayoutTests/http/wpt/webcodecs/transfer-non-detachable-buffer.any.worker-expected.txt:
Added.
*
LayoutTests/http/wpt/webcodecs/transfer-non-detachable-buffer.any.worker.html:
Added.
*
LayoutTests/imported/w3c/web-platform-tests/webcodecs/transfering.https.any-expected.txt:
*
LayoutTests/imported/w3c/web-platform-tests/webcodecs/transfering.https.any.worker-expected.txt:
* Source/WebCore/Headers.cmake:
* Source/WebCore/Modules/webcodecs/WebCodecsAudioData.cpp:
(WebCore::WebCodecsAudioData::create): Validates the transfer list, then
detaches
it once the platform object exists. Also drops a pointless move of
init.data.span(), since PlatformRawAudioData::create() takes a plain span.
* Source/WebCore/Modules/webcodecs/WebCodecsAudioData.h:
* Source/WebCore/Modules/webcodecs/WebCodecsAudioData.idl:
* Source/WebCore/Modules/webcodecs/WebCodecsAudioEncoder.cpp:
(WebCore::WebCodecsAudioEncoder::configure): Moves the encoded data into the
chunk instead of copying it through a JSC::ArrayBuffer.
* Source/WebCore/Modules/webcodecs/WebCodecsBufferTransfer.cpp: Added.
(WebCore::adoptArrayBufferContents): Wraps detached contents in a SharedBuffer.
(WebCore::WebCodecsTransferList::validate):
(WebCore::WebCodecsTransferList::detachAll const):
(WebCore::WebCodecsTransferList::takeData const):
* Source/WebCore/Modules/webcodecs/WebCodecsBufferTransfer.h: Added.
(WebCore::WebCodecsTransferList::WebCodecsTransferList):
(WebCore::WebCodecsTransferList::isEmpty const):
(WebCore::WebCodecsTransferList::contains const):
* Source/WebCore/Modules/webcodecs/WebCodecsEncodedAudioChunk.cpp:
(WebCore::WebCodecsEncodedAudioChunk::create): Validates and consumes the
transfer list; replaces the Init constructor, which could not report an
exception.
(WebCore::WebCodecsEncodedAudioChunk::WebCodecsEncodedAudioChunk): Deleted.
* Source/WebCore/Modules/webcodecs/WebCodecsEncodedAudioChunk.h:
(WebCore::WebCodecsEncodedAudioChunkStorage::create):
(WebCore::WebCodecsEncodedAudioChunkStorage::memoryCost const):
(WebCore::WebCodecsEncodedAudioChunk::create):
(WebCore::WebCodecsEncodedAudioChunk::byteLength const):
* Source/WebCore/Modules/webcodecs/WebCodecsEncodedAudioChunk.idl:
* Source/WebCore/Modules/webcodecs/WebCodecsEncodedAudioChunkData.h:
* Source/WebCore/Modules/webcodecs/WebCodecsEncodedVideoChunk.cpp:
(WebCore::WebCodecsEncodedVideoChunk::create): Ditto.
(WebCore::WebCodecsEncodedVideoChunk::WebCodecsEncodedVideoChunk): Deleted.
* Source/WebCore/Modules/webcodecs/WebCodecsEncodedVideoChunk.h:
(WebCore::WebCodecsEncodedVideoChunkStorage::create):
(WebCore::WebCodecsEncodedVideoChunkStorage::memoryCost const):
(WebCore::WebCodecsEncodedVideoChunk::create):
(WebCore::WebCodecsEncodedVideoChunk::byteLength const):
* Source/WebCore/Modules/webcodecs/WebCodecsEncodedVideoChunk.idl:
* Source/WebCore/Modules/webcodecs/WebCodecsEncodedVideoChunkData.h:
* Source/WebCore/Modules/webcodecs/WebCodecsImageDecoder.cpp:
(WebCore::WebCodecsImageDecoder::create): Validates the transfer list.
(WebCore::WebCodecsImageDecoder::WebCodecsImageDecoder): Adopts the transferred
contents rather than copying them. Removes a dead local that each lambda
shadowed, and two null checks on a SharedBuffer::create() returning Ref.
* Source/WebCore/Modules/webcodecs/WebCodecsImageDecoder.h:
* Source/WebCore/Modules/webcodecs/WebCodecsImageDecoder.idl:
* Source/WebCore/Modules/webcodecs/WebCodecsVideoEncoder.cpp:
(WebCore::WebCodecsVideoEncoder::configure): Ditto.
* Source/WebCore/Modules/webcodecs/WebCodecsVideoFrame.cpp:
(WebCore::WebCodecsVideoFrame::create): Validates the transfer list up front and
detaches it after the frame is created.
* Source/WebCore/Modules/webcodecs/WebCodecsVideoFrame.h:
* Source/WebCore/Modules/webcodecs/WebCodecsVideoFrame.idl:
* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/platform/SharedBuffer.cpp:
(WebCore::DataSegment::DataSegment): Moved out of line.
(WebCore::DataSegment::create): Added an overload taking ArrayBufferContents.
* Source/WebCore/platform/SharedBuffer.h: Reshuffling of inline DataSegment
constructor had to happen
in order to avoid pulling JSC headers in SharedBuffer.h. We moved them to
SharedBuffer.cpp near where they are actually called.
(WebCore::DataSegment::DataSegment): Deleted.
* Source/WebKit/Scripts/webkit/opaque_ipc_types.tracking.in: Moved the two chunk
payload records to a Ref<WebCore::SharedBuffer> group, matching their new type.
* Source/WebKit/Shared/WebCoreArgumentCodersMedia.serialization.in:
* Tools/TestWebKitAPI/CMakeLists.txt:
* Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* Tools/TestWebKitAPI/Tests/WebCore/WebCodecsBufferTransfer.cpp: Added.
(TestWebKitAPI::TEST(WebCodecsBufferTransfer, AdoptedContentsAreNotCopied)):
(TestWebKitAPI::TEST(WebCodecsBufferTransfer,
AdoptedContentsOutliveTheirArrayBuffer)):
(TestWebKitAPI::TEST(WebCodecsBufferTransfer,
AdoptedContentsCanBeReleasedOffTheMainThread)):
(TestWebKitAPI::TEST(WebCodecsBufferTransfer,
TransferredArrayBufferIsAdoptedWithoutCopying)):
Canonical link: https://commits.webkit.org/321548@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications