NS_IMETHODIMP ArrayBufferInputStream::SetData(JS::Handle<JS::Value> aBuffer, uint32_t aByteOffset, uint32_t aLength, JSContext* aCx) { if (!aBuffer.isObject()) { return NS_ERROR_FAILURE; } JS::RootedObject arrayBuffer(aCx, &aBuffer.toObject()); if (!JS_IsArrayBufferObject(arrayBuffer)) { return NS_ERROR_FAILURE; } mArrayBuffer.construct(aCx, aBuffer); uint32_t buflen = JS_GetArrayBufferByteLength(arrayBuffer); mOffset = std::min(buflen, aByteOffset); mBufferLength = std::min(buflen - mOffset, aLength); mBuffer = JS_GetStableArrayBufferData(aCx, arrayBuffer); if (!mBuffer) { return NS_ERROR_FAILURE; } return NS_OK; }
NS_IMETHODIMP nsBinaryInputStream::ReadArrayBuffer(uint32_t aLength, JS::Handle<JS::Value> aBuffer, JSContext* cx) { if (!aBuffer.isObject()) { return NS_ERROR_FAILURE; } JS::RootedObject buffer(cx, &aBuffer.toObject()); if (!JS_IsArrayBufferObject(buffer) || JS_GetArrayBufferByteLength(buffer) < aLength) { return NS_ERROR_FAILURE; } uint8_t* data = JS_GetStableArrayBufferData(cx, buffer); if (!data) { return NS_ERROR_FAILURE; } uint32_t bytesRead; nsresult rv = Read(reinterpret_cast<char*>(data), aLength, &bytesRead); if (NS_WARN_IF(NS_FAILED(rv))) return rv; if (bytesRead != aLength) { return NS_ERROR_FAILURE; } return NS_OK; }