diff --git a/dom/file/FileReader.cpp b/dom/file/FileReader.cpp index 771d4bbcff2a..37bdbe7fbc5f 100644 --- a/dom/file/FileReader.cpp +++ b/dom/file/FileReader.cpp @@ -290,10 +290,20 @@ FileReader::DoReadData(uint64_t aCount) mResult.GetMutableData(&buf, oldLen + aCount, fallible); NS_ENSURE_TRUE(buf, NS_ERROR_OUT_OF_MEMORY); + nsresult rv; + + // nsFileStreams do not implement ReadSegment. In case here we are dealing + // with a nsIAsyncInputStream, in content process, we need to wrap a + // nsIBufferedInputStream around it. + if (!mBufferedStream) { + rv = NS_NewBufferedInputStream(getter_AddRefs(mBufferedStream), + mAsyncStream, 8192); + NS_ENSURE_SUCCESS(rv, rv); + } + uint32_t bytesRead = 0; - nsresult rv = - mAsyncStream->ReadSegments(ReadFuncBinaryString, buf + oldLen, aCount, - &bytesRead); + rv = mBufferedStream->ReadSegments(ReadFuncBinaryString, buf + oldLen, + aCount, &bytesRead); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -350,6 +360,7 @@ FileReader::ReadFileContent(Blob& aBlob, mResultArrayBuffer = nullptr; mAsyncStream = nullptr; + mBufferedStream = nullptr; mTransferred = 0; mTotal = 0; @@ -374,27 +385,30 @@ FileReader::ReadFileContent(Blob& aBlob, return; } - nsCOMPtr transport; - aRv = sts->CreateInputTransport(stream, - /* aStartOffset */ 0, - /* aReadLimit */ -1, - /* aCloseWhenDone */ true, - getter_AddRefs(transport)); - if (NS_WARN_IF(aRv.Failed())) { - return; + mAsyncStream = do_QueryInterface(stream); + if (!mAsyncStream) { + nsCOMPtr transport; + aRv = sts->CreateInputTransport(stream, + /* aStartOffset */ 0, + /* aReadLimit */ -1, + /* aCloseWhenDone */ true, + getter_AddRefs(transport)); + if (NS_WARN_IF(aRv.Failed())) { + return; + } + + nsCOMPtr wrapper; + aRv = transport->OpenInputStream(/* aFlags */ 0, + /* aSegmentSize */ 0, + /* aSegmentCount */ 0, + getter_AddRefs(wrapper)); + if (NS_WARN_IF(aRv.Failed())) { + return; + } + + mAsyncStream = do_QueryInterface(wrapper); } - nsCOMPtr wrapper; - aRv = transport->OpenInputStream(/* aFlags */ 0, - /* aSegmentSize */ 0, - /* aSegmentCount */ 0, - getter_AddRefs(wrapper)); - if (NS_WARN_IF(aRv.Failed())) { - return; - } - - MOZ_ASSERT(!mAsyncStream); - mAsyncStream = do_QueryInterface(wrapper); MOZ_ASSERT(mAsyncStream); mTotal = mBlob->GetSize(aRv); @@ -529,6 +543,7 @@ FileReader::FreeDataAndDispatchSuccess() FreeFileData(); mResult.SetIsVoid(false); mAsyncStream = nullptr; + mBufferedStream = nullptr; mBlob = nullptr; // Dispatch event to signify end of a successful operation @@ -544,6 +559,7 @@ FileReader::FreeDataAndDispatchError() FreeFileData(); mResult.SetIsVoid(true); mAsyncStream = nullptr; + mBufferedStream = nullptr; mBlob = nullptr; // Dispatch error event to signify load failure @@ -729,6 +745,7 @@ FileReader::Abort() mResultArrayBuffer = nullptr; mAsyncStream = nullptr; + mBufferedStream = nullptr; mBlob = nullptr; //Clean up memory buffer @@ -782,6 +799,11 @@ FileReader::Shutdown() mAsyncStream = nullptr; } + if (mBufferedStream) { + mBufferedStream->Close(); + mBufferedStream = nullptr; + } + FreeFileData(); mResultArrayBuffer = nullptr; diff --git a/dom/file/FileReader.h b/dom/file/FileReader.h index b8461399041a..a0e297a9b671 100644 --- a/dom/file/FileReader.h +++ b/dom/file/FileReader.h @@ -180,6 +180,7 @@ private: bool mTimerIsActive; nsCOMPtr mAsyncStream; + nsCOMPtr mBufferedStream; RefPtr mError;