commit 9ee6cbb5aad6def1e050998b0abf3bc0d4f8486e
parent ce149dc63729a14055887d042e78952f1ea5ae61
Author: Atila Butkovits <abutkovits@mozilla.com>
Date: Thu, 6 Nov 2025 15:57:38 +0200
Revert "Bug 1994891 - Implement `transfer` for AudioDataInit r=aosmond" for causing Hazard failures at AudioData.cpp.
This reverts commit 1bd71e921991f2603bbad67fb8ebef43a199ae82.
Diffstat:
3 files changed, 16 insertions(+), 94 deletions(-)
diff --git a/dom/media/webcodecs/AudioData.cpp b/dom/media/webcodecs/AudioData.cpp
@@ -22,7 +22,6 @@
#include "mozilla/dom/StructuredCloneTags.h"
#include "nsFmtString.h"
#include "nsStringFwd.h"
-#include "nsTHashSet.h"
extern mozilla::LazyLogModule gWebCodecsLog;
@@ -215,83 +214,15 @@ already_AddRefed<AudioData> AudioData::Constructor(const GlobalObject& aGlobal,
aRv.ThrowTypeError(rv.inspectErr());
return nullptr;
}
-
- nsTHashSet<const JSObject*> transferSet;
- for (const auto& buffer : aInit.mTransfer) {
- if (transferSet.Contains(buffer.Obj())) {
- // 9.2.2.2. If init.transfer contains more than one reference to
- // the same ArrayBuffer, then throw a DataCloneError DOMException.
- LOGE("AudioData Constructor -- duplicate transferred ArrayBuffer");
- aRv.ThrowDataCloneError(
- "Transfer contains duplicate ArrayBuffer objects");
- return nullptr;
- }
- transferSet.Insert(buffer.Obj());
- }
-
- for (const auto& buffer : aInit.mTransfer) {
- if (JS::IsDetachedArrayBufferObject(buffer.Obj())) {
- // 9.2.2.3.1. If [[Detached]] internal slot is true, then
- // throw a DataCloneError DOMException.
- LOGE("AudioData Constructor -- detached transferred ArrayBuffer");
- aRv.ThrowDataCloneError("Transfer contains detached ArrayBuffer objects");
- return nullptr;
- }
- }
-
- // 9.2.2.4.7. If init.transfer contains an ArrayBuffer referenced by init.data
- // the User Agent MAY choose to:
- // 9.2.2.4.7.1. Let resource be a new media resource referencing sample data
- // in data.
- size_t transferLen;
- size_t transferOffset = 0;
- JSObject* transferBuffer = nullptr;
- const auto& data = aInit.mData;
- if (data.IsArrayBuffer()) {
- JS::Rooted<JSObject*> bufferObj(aGlobal.Context(),
- data.GetAsArrayBuffer().Obj());
- if (transferSet.Contains(bufferObj)) {
- transferBuffer = bufferObj;
- transferLen = JS::GetArrayBufferByteLength(bufferObj);
- }
- } else if (data.IsArrayBufferView()) {
- JS::Rooted<JSObject*> viewObj(aGlobal.Context(),
- data.GetAsArrayBufferView().Obj());
- bool isShared;
- JSObject* arrayBuffer =
- JS_GetArrayBufferViewBuffer(aGlobal.Context(), viewObj, &isShared);
- if (transferSet.Contains(arrayBuffer)) {
- transferBuffer = arrayBuffer;
- transferOffset = JS_GetArrayBufferViewByteOffset(viewObj);
- transferLen = JS_GetArrayBufferViewByteLength(viewObj);
- }
- }
- UniquePtr<uint8_t[], JS::FreePolicy> transferData;
- if (transferBuffer) {
- JS::Rooted<JSObject*> bufferObj(aGlobal.Context(), transferBuffer);
- void* bufferContents =
- JS::StealArrayBufferContents(aGlobal.Context(), bufferObj);
- transferData = UniquePtr<uint8_t[], JS::FreePolicy>(
- static_cast<uint8_t*>(bufferContents));
- }
-
- auto resource =
- transferData ? MakeAndAddRef<AudioDataResource>(
- std::move(transferData), transferOffset, transferLen)
- : AudioDataResource::Construct(data);
+ auto resource = AudioDataResource::Construct(aInit.mData);
if (resource.isErr()) {
LOGD("AudioData::Constructor failure (OOM)");
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
return nullptr;
}
- // 9.2.2.3. For each transferable in init.transfer:
- // 9.2.2.3.1. Perform DetachArrayBuffer on transferable
- for (const auto& buffer : aInit.mTransfer) {
- JS::Rooted<JSObject*> obj(aGlobal.Context(), buffer.Obj());
- JS::DetachArrayBuffer(aGlobal.Context(), obj);
- }
- return MakeAndAddRef<AudioData>(global, resource.unwrap(), aInit);
+ return MakeAndAddRef<mozilla::dom::AudioData>(global, resource.unwrap(),
+ aInit);
}
// https://w3c.github.io/webcodecs/#dom-audiodata-format
diff --git a/dom/media/webcodecs/AudioData.h b/dom/media/webcodecs/AudioData.h
@@ -132,19 +132,13 @@ class AudioData final : public nsISupports, public nsWrapperCache {
class AudioDataResource final {
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AudioDataResource);
explicit AudioDataResource(FallibleTArray<uint8_t>&& aData)
- : mCopiedData(std::move(aData)) {}
+ : mData(std::move(aData)) {}
- explicit AudioDataResource() : mCopiedData() {}
- /// Create AudioDataResource, transferring ownership from js_malloc'd data.
- AudioDataResource(UniquePtr<uint8_t[], JS::FreePolicy>&& aData,
- size_t aOffset, size_t aLen)
- : mAdoptedData(std::move(aData)),
- mAdoptedDataOffset(aOffset),
- mAdoptedDataLen(aLen) {}
+ explicit AudioDataResource() : mData() {}
static AudioDataResource* Create(const Span<uint8_t>& aData) {
AudioDataResource* resource = new AudioDataResource();
- if (!resource->mCopiedData.AppendElements(aData, mozilla::fallible_t())) {
+ if (!resource->mData.AppendElements(aData, mozilla::fallible_t())) {
return nullptr;
}
return resource;
@@ -153,20 +147,13 @@ class AudioDataResource final {
static Result<already_AddRefed<AudioDataResource>, nsresult> Construct(
const OwningAllowSharedBufferSource& aInit);
- Span<uint8_t> Data() {
- return mAdoptedData
- ? Span(mAdoptedData.get() + mAdoptedDataOffset, mAdoptedDataLen)
- : Span(mCopiedData.Elements(), mCopiedData.Length());
- }
+ Span<uint8_t> Data() { return Span(mData.Elements(), mData.Length()); };
private:
~AudioDataResource() = default;
// It's always possible for the allocation to fail -- the size is
// controled by script.
- FallibleTArray<uint8_t> mCopiedData;
- UniquePtr<uint8_t[], JS::FreePolicy> mAdoptedData;
- size_t mAdoptedDataOffset;
- size_t mAdoptedDataLen;
+ FallibleTArray<uint8_t> mData;
};
struct AudioDataSerializedData {
diff --git a/testing/web-platform/meta/webcodecs/transfering.https.any.js.ini b/testing/web-platform/meta/webcodecs/transfering.https.any.js.ini
@@ -11,9 +11,11 @@
[Test transfering ArrayBuffer to EncodedVideoChunk]
expected: FAIL
+ [Test transfering ArrayBuffer to AudioData]
+ expected: FAIL
+
[Encoding from AudioData with transferred buffer]
- expected:
- if os == "android": FAIL
+ expected: FAIL
[Test transfering buffers to VideoFrame with uneven samples]
expected: FAIL
@@ -32,9 +34,11 @@
[Test transfering ArrayBuffer to EncodedVideoChunk]
expected: FAIL
+ [Test transfering ArrayBuffer to AudioData]
+ expected: FAIL
+
[Encoding from AudioData with transferred buffer]
- expected:
- if os == "android": FAIL
+ expected: FAIL
[Test transfering buffers to VideoFrame with uneven samples]
expected: FAIL