Bug 1349883 - part 4: strengthen precondition of ReturnDecodedData(). r=jya draft
authorJohn Lin <jolin@mozilla.com>
Fri, 07 Apr 2017 17:17:17 +0800
changeset 561003 33c2a23d642d4a66dbf650794fe045777499c3bd
parent 561002 33b6a056129b07af874a91e069aba1c5ba982572
child 561228 fd7362e75db2568968b6df6d4a602901caa7c10f
child 561232 b6518984559ab8319a4a4d7b24f1c9cd0725fa20
push id53589
push userbmo:jolin@mozilla.com
push dateWed, 12 Apr 2017 03:42:17 +0000
reviewersjya
bugs1349883
milestone55.0a1
Bug 1349883 - part 4: strengthen precondition of ReturnDecodedData(). r=jya MozReview-Commit-ID: 2jLNlrHEE0b
dom/media/platforms/android/RemoteDataDecoder.cpp
--- 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();
   }