Bug 1641826 - P1 - PartiallySeekableInputStream does not return error and executes callback on AsyncWait/AsyncLengthWait if stream is closed r=baku,necko-reviewers,mayhemer

Differential Revision: https://phabricator.services.mozilla.com/D77409
This commit is contained in:
ssengupta 2020-06-02 19:04:20 +00:00
Родитель ad95ccf4d2
Коммит d95870593b
1 изменённых файлов: 30 добавлений и 4 удалений

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

@ -235,12 +235,20 @@ PartiallySeekableInputStream::AsyncWait(nsIInputStreamCallback* aCallback,
uint32_t aRequestedCount, uint32_t aRequestedCount,
nsIEventTarget* aEventTarget) { nsIEventTarget* aEventTarget) {
if (mClosed) { if (mClosed) {
return NS_BASE_STREAM_CLOSED; if (aCallback) {
if (aEventTarget) {
nsCOMPtr<nsIInputStreamCallback> callable = NS_NewInputStreamReadyEvent(
"PartiallySeekableInputStream::OnInputStreamReady", aCallback,
aEventTarget);
callable->OnInputStreamReady(this);
} else {
aCallback->OnInputStreamReady(this);
}
}
return NS_OK;
} }
NS_ENSURE_STATE(mWeakAsyncInputStream);
nsCOMPtr<nsIInputStreamCallback> callback = aCallback ? this : nullptr;
{ {
MutexAutoLock lock(mMutex); MutexAutoLock lock(mMutex);
if (mAsyncWaitCallback && aCallback) { if (mAsyncWaitCallback && aCallback) {
@ -250,6 +258,8 @@ PartiallySeekableInputStream::AsyncWait(nsIInputStreamCallback* aCallback,
mAsyncWaitCallback = aCallback; mAsyncWaitCallback = aCallback;
} }
NS_ENSURE_STATE(mWeakAsyncInputStream);
nsCOMPtr<nsIInputStreamCallback> callback = aCallback ? this : nullptr;
return mWeakAsyncInputStream->AsyncWait(callback, aFlags, aRequestedCount, return mWeakAsyncInputStream->AsyncWait(callback, aFlags, aRequestedCount,
aEventTarget); aEventTarget);
} }
@ -379,6 +389,22 @@ PartiallySeekableInputStream::Length(int64_t* aLength) {
NS_IMETHODIMP NS_IMETHODIMP
PartiallySeekableInputStream::AsyncLengthWait( PartiallySeekableInputStream::AsyncLengthWait(
nsIInputStreamLengthCallback* aCallback, nsIEventTarget* aEventTarget) { nsIInputStreamLengthCallback* aCallback, nsIEventTarget* aEventTarget) {
if (mClosed) {
if (aCallback) {
const RefPtr<PartiallySeekableInputStream> self = this;
const nsCOMPtr<nsIInputStreamLengthCallback> callback = aCallback;
nsCOMPtr<nsIRunnable> runnable = NS_NewRunnableFunction(
"PartiallySeekableInputStream::OnInputStreamLengthReady",
[self, callback] { callback->OnInputStreamLengthReady(self, -1); });
if (aEventTarget) {
aEventTarget->Dispatch(runnable, NS_DISPATCH_NORMAL);
} else {
runnable->Run();
}
}
return NS_OK;
}
NS_ENSURE_STATE(mWeakAsyncInputStreamLength); NS_ENSURE_STATE(mWeakAsyncInputStreamLength);
nsCOMPtr<nsIInputStreamLengthCallback> callback = aCallback ? this : nullptr; nsCOMPtr<nsIInputStreamLengthCallback> callback = aCallback ? this : nullptr;