Bug 1280445 - Clean up MediaStreamAudioSourceNode's TrackListener on destruction. r?padenot
MozReview-Commit-ID: L8ZOwiiFO15
--- a/dom/media/webaudio/MediaStreamAudioSourceNode.cpp
+++ b/dom/media/webaudio/MediaStreamAudioSourceNode.cpp
@@ -13,20 +13,17 @@
#include "mozilla/CORSMode.h"
namespace mozilla {
namespace dom {
NS_IMPL_CYCLE_COLLECTION_CLASS(MediaStreamAudioSourceNode)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(MediaStreamAudioSourceNode)
- if (tmp->mInputStream) {
- tmp->mInputStream->UnregisterTrackListener(tmp);
- }
- tmp->DetachFromTrack();
+ tmp->Destroy();
NS_IMPL_CYCLE_COLLECTION_UNLINK(mInputStream)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mInputTrack)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END_INHERITED(AudioNode)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(MediaStreamAudioSourceNode, AudioNode)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mInputStream)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mInputTrack)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
@@ -75,17 +72,30 @@ MediaStreamAudioSourceNode::Init(DOMMedi
AudioNodeEngine* engine = new MediaStreamAudioSourceNodeEngine(this);
mStream = AudioNodeExternalInputStream::Create(graph, engine);
mInputStream->AddConsumerToKeepAlive(static_cast<nsIDOMEventTarget*>(this));
mInputStream->RegisterTrackListener(this);
AttachToFirstTrack(mInputStream);
}
-MediaStreamAudioSourceNode::~MediaStreamAudioSourceNode() {}
+void
+MediaStreamAudioSourceNode::Destroy()
+{
+ if (mInputStream) {
+ mInputStream->UnregisterTrackListener(this);
+ mInputStream = nullptr;
+ }
+ DetachFromTrack();
+}
+
+MediaStreamAudioSourceNode::~MediaStreamAudioSourceNode()
+{
+ Destroy();
+}
void
MediaStreamAudioSourceNode::AttachToTrack(const RefPtr<MediaStreamTrack>& aTrack)
{
MOZ_ASSERT(!mInputTrack);
if (!mStream) {
return;
}
--- a/dom/media/webaudio/MediaStreamAudioSourceNode.h
+++ b/dom/media/webaudio/MediaStreamAudioSourceNode.h
@@ -84,16 +84,17 @@ public:
void NotifyTrackRemoved(const RefPtr<MediaStreamTrack>& aTrack) override;
// From PrincipalChangeObserver<MediaStreamTrack>.
void PrincipalChanged(MediaStreamTrack* aMediaStreamTrack) override;
protected:
explicit MediaStreamAudioSourceNode(AudioContext* aContext);
void Init(DOMMediaStream* aMediaStream, ErrorResult& aRv);
+ void Destroy();
virtual ~MediaStreamAudioSourceNode();
private:
RefPtr<MediaInputPort> mInputPort;
RefPtr<DOMMediaStream> mInputStream;
// On construction we set this to the first audio track of mInputStream.
RefPtr<MediaStreamTrack> mInputTrack;