Bug 1360807 - FileReaderSync must work with sync inputStream - part 4 - Base64EncodeInputStream needs a sync inputStream, r=smaug

This commit is contained in:
Andrea Marchesini 2017-05-05 14:45:14 +02:00
Родитель cffbaf4514
Коммит 33e3c76f21
2 изменённых файлов: 34 добавлений и 13 удалений

Просмотреть файл

@ -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) {

Просмотреть файл

@ -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<nsIInputStream> 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<nsIInputStream> 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<nsIAsyncInputStream> asyncStream = do_QueryInterface(aAsyncStream);
if (!asyncStream) {
nsCOMPtr<nsIInputStream> stream = aAsyncStream;
stream.forget(aSyncStream);
return NS_OK;
return NS_NewBufferedInputStream(aSyncStream, aAsyncStream, 4096);
}
uint64_t length;