Bug 1401922 - P1. Ensure an error is returned when no decoder could be created. r?alwu draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Thu, 21 Sep 2017 13:25:05 +0200 (2017-09-21)
changeset 668446 b887f65aff080f7ab167ed31ae852dad9597e890
parent 668238 a8d9f6d6103ef64e2444e11900f100635efb0787
child 668447 ad1e20b5885f8d3d4b14cb15e2671f22d03566ab
push id81052
push userbmo:jyavenard@mozilla.com
push dateThu, 21 Sep 2017 17:38:47 +0000 (2017-09-21)
reviewersalwu
bugs1401922
milestone57.0a1
Bug 1401922 - P1. Ensure an error is returned when no decoder could be created. r?alwu PDMFactory::CreateDecoder may not always modify CreateDecoderParams::mError as not all PDM handle this optional return value. MozReview-Commit-ID: K8WFA0o778U
dom/media/MediaFormatReader.cpp
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -691,16 +691,17 @@ MediaFormatReader::DecoderFactory::RunSt
       MOZ_ASSERT(!aData.mDecoder);
       MOZ_ASSERT(!aData.mInitRequest.Exists());
 
       MediaResult rv = DoCreateDecoder(aData);
       if (NS_FAILED(rv)) {
         NS_WARNING("Error constructing decoders");
         aData.mToken = nullptr;
         aData.mStage = Stage::None;
+        aData.mOwnerData.mDescription = rv.Description();
         mOwner->NotifyError(aData.mTrack, rv);
         return;
       }
 
       aData.mDecoder = new Wrapper(aData.mDecoder.forget(), aData.mToken.forget());
       DoInitDecoder(aData);
       aData.mStage = Stage::WaitForInit;
       break;
@@ -722,17 +723,22 @@ MediaFormatReader::DecoderFactory::DoCre
   if (!mOwner->mPlatform) {
     mOwner->mPlatform = new PDMFactory();
     if (mOwner->IsEncrypted()) {
       MOZ_ASSERT(mOwner->mCDMProxy);
       mOwner->mPlatform->SetCDMProxy(mOwner->mCDMProxy);
     }
   }
 
-  MediaResult result(NS_OK);
+  // result may not be updated by PDMFactory::CreateDecoder, as such it must be
+  // initialized to a fatal error by default.
+  MediaResult result = MediaResult(
+    NS_ERROR_DOM_MEDIA_FATAL_ERR,
+    nsPrintfCString("error creating %s decoder", TrackTypeToStr(aData.mTrack)));
+
   switch (aData.mTrack) {
     case TrackInfo::kAudioTrack: {
       aData.mDecoder = mOwner->mPlatform->CreateDecoder({
         ownerData.mInfo
         ? *ownerData.mInfo->GetAsAudioInfo()
         : *ownerData.mOriginalInfo->GetAsAudioInfo(),
         ownerData.mTaskQueue,
         mOwner->mCrashHelper,
@@ -765,19 +771,17 @@ MediaFormatReader::DecoderFactory::DoCre
     default:
       break;
   }
 
   if (aData.mDecoder) {
     return NS_OK;
   }
 
-  if (NS_FAILED(result)) {
-    ownerData.mDescription = result.Description();
-  }
+  MOZ_RELEASE_ASSERT(NS_FAILED(result), "PDM returned an invalid error code");
 
   return result;
 }
 
 void
 MediaFormatReader::DecoderFactory::DoInitDecoder(Data& aData)
 {
   auto& ownerData = aData.mOwnerData;