Bug 1349883 - part 4: strengthen precondition of ReturnDecodedData(). r=jya
MozReview-Commit-ID: 2jLNlrHEE0b
--- a/dom/media/platforms/android/RemoteDataDecoder.cpp
+++ b/dom/media/platforms/android/RemoteDataDecoder.cpp
@@ -455,16 +455,19 @@ RemoteDataDecoder::Flush()
});
}
RefPtr<MediaDataDecoder::DecodePromise>
RemoteDataDecoder::Drain()
{
RefPtr<RemoteDataDecoder> self = this;
return InvokeAsync(mTaskQueue, __func__, [self, this]() {
+ if (mShutdown) {
+ return DecodePromise::CreateAndReject(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ }
RefPtr<DecodePromise> p = mDrainPromise.Ensure(__func__);
if (mDrainStatus == DrainStatus::DRAINED) {
// There's no operation to perform other than returning any already
// decoded data.
ReturnDecodedData();
return p;
}
@@ -587,25 +590,19 @@ RemoteDataDecoder::UpdateOutputStatus(Me
}
mDecodedData.AppendElement(aSample);
ReturnDecodedData();
}
void
RemoteDataDecoder::ReturnDecodedData()
{
- if (!mTaskQueue->IsCurrentThreadIn()) {
- mTaskQueue->Dispatch(
- NewRunnableMethod(this, &RemoteDataDecoder::ReturnDecodedData));
- return;
- }
AssertOnTaskQueue();
- if (mShutdown) {
- return;
- }
+ MOZ_ASSERT(!mShutdown);
+
// We only want to clear mDecodedData when we have resolved the promises.
if (!mDecodePromise.IsEmpty()) {
mDecodePromise.Resolve(mDecodedData, __func__);
mDecodedData.Clear();
} else if (!mDrainPromise.IsEmpty()) {
mDrainPromise.Resolve(mDecodedData, __func__);
mDecodedData.Clear();
}