tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mdom/media/webcodecs/AudioData.cpp | 75+++------------------------------------------------------------------------
Mdom/media/webcodecs/AudioData.h | 23+++++------------------
Mtesting/web-platform/meta/webcodecs/transfering.https.any.js.ini | 12++++++++----
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