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
--- 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) {