Bug 1332845 - Remove listeners before other cleanup in MediaRecorder. r?jesup draft
authorAndreas Pehrson <pehrsons@gmail.com>
Fri, 07 Apr 2017 16:50:55 +0200
changeset 558400 7f1f36e5fe6586d7f299d98b812883b51d6a7a58
parent 552445 d4af7ec6cfcd9b81cd1f433a00b412de61e95b62
child 558401 67859512eac79047a63f4ad9ceff94fda3970f28
push id52879
push userbmo:pehrson@telenordigital.com
push dateFri, 07 Apr 2017 15:51:40 +0000
reviewersjesup
bugs1332845
milestone55.0a1
Bug 1332845 - Remove listeners before other cleanup in MediaRecorder. r?jesup There was an indirect race from destroying this MediaInputPort before removing the direct listener. MozReview-Commit-ID: 7rPzsLL4EvG
dom/media/MediaRecorder.cpp
--- a/dom/media/MediaRecorder.cpp
+++ b/dom/media/MediaRecorder.cpp
@@ -820,21 +820,16 @@ private:
   void CleanupStreams()
   {
     if (mInputStream) {
       if (mEncoder) {
         mInputStream->RemoveDirectListener(mEncoder.get());
       }
       mInputStream = nullptr;
     }
-    for (RefPtr<MediaInputPort>& inputPort : mInputPorts) {
-      MOZ_ASSERT(inputPort);
-      inputPort->Destroy();
-    }
-    mInputPorts.Clear();
 
     if (mTrackUnionStream) {
       if (mEncoder) {
         nsTArray<RefPtr<mozilla::dom::VideoStreamTrack>> videoTracks;
         DOMMediaStream* domStream = mRecorder->Stream();
         if (domStream) {
           domStream->GetVideoTracks(videoTracks);
           if (!videoTracks.IsEmpty()) {
@@ -850,16 +845,22 @@ private:
       }
       if (mEncoder) {
         mTrackUnionStream->RemoveListener(mEncoder.get());
       }
       mTrackUnionStream->Destroy();
       mTrackUnionStream = nullptr;
     }
 
+    for (RefPtr<MediaInputPort>& inputPort : mInputPorts) {
+      MOZ_ASSERT(inputPort);
+      inputPort->Destroy();
+    }
+    mInputPorts.Clear();
+
     if (mMediaStream) {
       mMediaStream->UnregisterTrackListener(this);
       mMediaStream = nullptr;
     }
 
     for (RefPtr<MediaStreamTrack>& track : mMediaStreamTracks) {
       track->RemovePrincipalChangeObserver(this);
     }