nsresult MemoryBlockCache::WriteBlock(uint32_t aBlockIndex, Span<const uint8_t> aData1, Span<const uint8_t> aData2) { MutexAutoLock lock(mMutex); size_t offset = BlockIndexToOffset(aBlockIndex); if (offset + aData1.Length() + aData2.Length() > mBuffer.Length() && !mHasGrown) { LOG("WriteBlock() MEMORYBLOCKCACHE_ERRORS='WriteBlockOverflow'"); Telemetry::Accumulate(Telemetry::HistogramID::MEMORYBLOCKCACHE_ERRORS, WriteBlockOverflow); } if (!EnsureBufferCanContain(offset + aData1.Length() + aData2.Length())) { LOG("WriteBlock() MEMORYBLOCKCACHE_ERRORS='WriteBlockCannotGrow'"); Telemetry::Accumulate(Telemetry::HistogramID::MEMORYBLOCKCACHE_ERRORS, WriteBlockCannotGrow); return NS_ERROR_FAILURE; } memcpy(mBuffer.Elements() + offset, aData1.Elements(), aData1.Length()); if (aData2.Length() > 0) { memcpy(mBuffer.Elements() + offset + aData1.Length(), aData2.Elements(), aData2.Length()); } return NS_OK; }
already_AddRefed<nsIDocument> DOMParser::ParseFromBuffer(Span<const uint8_t> aBuf, SupportedType aType, ErrorResult& aRv) { // The new stream holds a reference to the buffer nsCOMPtr<nsIInputStream> stream; nsresult rv = NS_NewByteInputStream(getter_AddRefs(stream), reinterpret_cast<const char *>(aBuf.Elements()), aBuf.Length(), NS_ASSIGNMENT_DEPEND); if (NS_FAILED(rv)) { aRv.Throw(rv); return nullptr; } return ParseFromStream(stream, VoidString(), aBuf.Length(), aType, aRv); }