Bug 1458166 - Remove listeners before destroying MediaStreams. r?bryce draft
authorAndreas Pehrson <pehrsons@mozilla.com>
Mon, 07 May 2018 11:36:35 +0200
changeset 791998 fd6123abc369dba1c77eed1489970a879f4bb436
parent 791997 c0e4bc47c85446dc3a69ce39f8621b05d237a218
push id108943
push userbmo:apehrson@mozilla.com
push dateMon, 07 May 2018 09:39:26 +0000
reviewersbryce
bugs1458166
milestone61.0a1
Bug 1458166 - Remove listeners before destroying MediaStreams. r?bryce If listeners are still registered to a MediaStream on MediaStream::Destroy (triggered by MediaStream::UnregisterUser below), they will catch and act on further events from the MediaStream (such as a track ending). This may dispatch runnables that are unnecessary since we know we are shutting down. If we first remove the listeners from the MediaStream we will never see said events. MozReview-Commit-ID: IZ1kENqL2C8
dom/media/DOMMediaStream.cpp
--- a/dom/media/DOMMediaStream.cpp
+++ b/dom/media/DOMMediaStream.cpp
@@ -450,20 +450,26 @@ DOMMediaStream::~DOMMediaStream()
   Destroy();
 }
 
 void
 DOMMediaStream::Destroy()
 {
   LOG(LogLevel::Debug, ("DOMMediaStream %p Being destroyed.", this));
   if (mOwnedListener) {
+    if (mOwnedStream) {
+      mOwnedStream->RemoveListener(mOwnedListener);
+    }
     mOwnedListener->Forget();
     mOwnedListener = nullptr;
   }
   if (mPlaybackListener) {
+    if (mPlaybackStream) {
+      mPlaybackStream->RemoveListener(mPlaybackListener);
+    }
     mPlaybackListener->Forget();
     mPlaybackListener = nullptr;
   }
   for (const RefPtr<TrackPort>& info : mTracks) {
     // We must remove ourselves from each track's principal change observer list
     // before we die. CC may have cleared info->mTrack so guard against it.
     MediaStreamTrack* track = info->GetTrack();
     if (track) {