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
--- 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);
}