Bug 1285121 - cancel callbacks before rejecting the promise. r=kaku draft
authorJW Wang <jwwang@mozilla.com>
Thu, 07 Jul 2016 14:30:54 +0800
changeset 388947 1e42a6689c506816338499d40965634dcd5c4c34
parent 388749 711963e8daa312ae06409f8ab5c06612cb0b8f7b
child 389341 3f45ec683751240033a3679978bed3862055ff0e
push id23270
push userjwwang@mozilla.com
push dateMon, 18 Jul 2016 10:04:12 +0000
reviewerskaku
bugs1285121
milestone50.0a1
Bug 1285121 - cancel callbacks before rejecting the promise. r=kaku MozReview-Commit-ID: 1Ly4ZW1d6KL
dom/media/AccurateSeekTask.cpp
--- a/dom/media/AccurateSeekTask.cpp
+++ b/dom/media/AccurateSeekTask.cpp
@@ -319,16 +319,17 @@ AccurateSeekTask::OnAudioDecoded(MediaDa
 
   AdjustFastSeekIfNeeded(audio);
 
   if (mTarget.IsFast()) {
     // Non-precise seek; we can stop the seek at the first sample.
     mSeekedAudioData = audio;
     mDoneAudioSeeking = true;
   } else if (NS_FAILED(DropAudioUpToSeekTarget(audio))) {
+    CancelCallbacks();
     RejectIfExist(__func__);
     return;
   }
 
   if (!mDoneAudioSeeking) {
     RequestAudioData();
     return;
   }
@@ -346,16 +347,17 @@ AccurateSeekTask::OnNotDecoded(MediaData
 
   // Ignore pending requests from video-only seek.
   if (aType == MediaData::AUDIO_DATA && mTarget.IsVideoOnly()) {
     return;
   }
 
   if (aReason == MediaDecoderReader::DECODE_ERROR) {
     // If this is a decode error, delegate to the generic error path.
+    CancelCallbacks();
     RejectIfExist(__func__);
     return;
   }
 
   // If the decoder is waiting for data, we tell it to call us back when the
   // data arrives.
   if (aReason == MediaDecoderReader::WAITING_FOR_DATA) {
     mReader->WaitForData(aType);
@@ -410,16 +412,17 @@ AccurateSeekTask::OnVideoDecoded(MediaDa
 
   AdjustFastSeekIfNeeded(video);
 
   if (mTarget.IsFast()) {
     // Non-precise seek. We can stop the seek at the first sample.
     mSeekedVideoData = video;
     mDoneVideoSeeking = true;
   } else if (NS_FAILED(DropVideoUpToSeekTarget(video.get()))) {
+    CancelCallbacks();
     RejectIfExist(__func__);
     return;
   }
 
   if (!mDoneVideoSeeking) {
     RequestVideoData();
     return;
   }
@@ -470,14 +473,14 @@ AccurateSeekTask::SetCallbacks()
     }
   });
 }
 
 void
 AccurateSeekTask::CancelCallbacks()
 {
   AssertOwnerThread();
-  mAudioCallback.Disconnect();
-  mVideoCallback.Disconnect();
-  mAudioWaitCallback.Disconnect();
-  mVideoWaitCallback.Disconnect();
+  mAudioCallback.DisconnectIfExists();
+  mVideoCallback.DisconnectIfExists();
+  mAudioWaitCallback.DisconnectIfExists();
+  mVideoWaitCallback.DisconnectIfExists();
 }
 } // namespace mozilla