зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1360807 - FileReaderSync must work with sync inputStream - part 4 - Base64EncodeInputStream needs a sync inputStream, r=smaug
This commit is contained in:
Родитель
cffbaf4514
Коммит
33e3c76f21
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче