From 33e3c76f21ca5ea6b2bbb91519824ae56d6184c3 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Fri, 5 May 2017 14:45:14 +0200 Subject: [PATCH] Bug 1360807 - FileReaderSync must work with sync inputStream - part 4 - Base64EncodeInputStream needs a sync inputStream, r=smaug --- dom/file/FileReader.cpp | 6 ++--- dom/workers/FileReaderSync.cpp | 41 +++++++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/dom/file/FileReader.cpp b/dom/file/FileReader.cpp index e8e3fa4f66e4..27fd9b91e88e 100644 --- a/dom/file/FileReader.cpp +++ b/dom/file/FileReader.cpp @@ -645,10 +645,10 @@ FileReader::OnInputStreamReady(nsIAsyncInputStream* aStream) if (NS_SUCCEEDED(rv) && count) { rv = DoReadData(count); - } - if (NS_SUCCEEDED(rv)) { - rv = DoAsyncWait(); + if (NS_SUCCEEDED(rv)) { + rv = DoAsyncWait(); + } } if (NS_FAILED(rv) || !count) { diff --git a/dom/workers/FileReaderSync.cpp b/dom/workers/FileReaderSync.cpp index 9f9a008666d0..a8da4abd3ea9 100644 --- a/dom/workers/FileReaderSync.cpp +++ b/dom/workers/FileReaderSync.cpp @@ -21,6 +21,7 @@ #include "nsIConverterInputStream.h" #include "nsIInputStream.h" #include "nsIMultiplexInputStream.h" +#include "nsStreamUtils.h" #include "nsStringStream.h" #include "nsISupportsImpl.h" #include "nsNetUtil.h" @@ -82,7 +83,12 @@ FileReaderSync::ReadAsArrayBuffer(JSContext* aCx, if (NS_WARN_IF(aRv.Failed())) { return; } - NS_ASSERTION(numRead == blobSize, "failed to read data"); + + // The file is changed in the meantime? + if (numRead != blobSize) { + aRv.Throw(NS_ERROR_FAILURE); + return; + } JSObject* arrayBuffer = JS_NewArrayBufferWithContents(aCx, blobSize, bufferData.get()); if (!arrayBuffer) { @@ -150,6 +156,12 @@ FileReaderSync::ReadAsText(Blob& aBlob, return; } + // No data, we don't need to continue. + if (numRead == 0) { + aResult.Truncate(); + return; + } + // The BOM sniffing is baked into the "decode" part of the Encoding // Standard, which the File API references. if (!nsContentUtils::CheckForBOM((const unsigned char*)sniffBuf.BeginReading(), @@ -244,19 +256,30 @@ FileReaderSync::ReadAsDataURL(Blob& aBlob, nsAString& aResult, return; } - uint64_t size = aBlob.GetSize(aRv); + nsCOMPtr syncStream; + aRv = ConvertAsyncToSyncStream(stream, getter_AddRefs(syncStream)); + if (NS_WARN_IF(aRv.Failed())) { + return; + } + + uint64_t size; + aRv = syncStream->Available(&size); + if (NS_WARN_IF(aRv.Failed())) { + return; + } + + uint64_t blobSize = aBlob.GetSize(aRv); if (NS_WARN_IF(aRv.Failed())){ return; } - nsCOMPtr bufferedStream; - aRv = NS_NewBufferedInputStream(getter_AddRefs(bufferedStream), stream, size); - if (NS_WARN_IF(aRv.Failed())){ + // The file is changed in the meantime? + if (blobSize != size) { return; } nsAutoString encodedData; - aRv = Base64EncodeInputStream(bufferedStream, encodedData, size); + aRv = Base64EncodeInputStream(syncStream, encodedData, size); if (NS_WARN_IF(aRv.Failed())){ return; } @@ -445,12 +468,10 @@ nsresult FileReaderSync::ConvertAsyncToSyncStream(nsIInputStream* aAsyncStream, nsIInputStream** aSyncStream) { - // If the stream is not async, we have nothing to do here. + // If the stream is not async, we just need it to be bufferable. nsCOMPtr asyncStream = do_QueryInterface(aAsyncStream); if (!asyncStream) { - nsCOMPtr stream = aAsyncStream; - stream.forget(aSyncStream); - return NS_OK; + return NS_NewBufferedInputStream(aSyncStream, aAsyncStream, 4096); } uint64_t length;