commit bfd77462f060276f354c3b9afb87ea42d1fc46fc
parent 67dc5fb2c382cb1e13b247dcfced07ada2ab1ea9
Author: Andreas Pehrson <apehrson@mozilla.com>
Date: Tue, 11 Nov 2025 08:20:21 +0000
Bug 1771789 - Implement MediaStreamTrack::CloneInternal in a single place with templates. r=jib
Differential Revision: https://phabricator.services.mozilla.com/D266380
Diffstat:
6 files changed, 18 insertions(+), 21 deletions(-)
diff --git a/dom/media/AudioStreamTrack.cpp b/dom/media/AudioStreamTrack.cpp
@@ -40,9 +40,8 @@ void AudioStreamTrack::GetLabel(nsAString& aLabel, CallerType aCallerType) {
MediaStreamTrack::GetLabel(aLabel, aCallerType);
}
-already_AddRefed<MediaStreamTrack> AudioStreamTrack::CloneInternal() {
- return do_AddRef(new AudioStreamTrack(mWindow, mInputTrack, mSource,
- ReadyState(), Muted(), mConstraints));
+already_AddRefed<MediaStreamTrack> AudioStreamTrack::Clone() {
+ return MediaStreamTrack::CloneInternal<AudioStreamTrack>();
}
} // namespace mozilla::dom
diff --git a/dom/media/AudioStreamTrack.h b/dom/media/AudioStreamTrack.h
@@ -24,6 +24,8 @@ class AudioStreamTrack : public MediaStreamTrack {
: MediaStreamTrack(aWindow, aInputTrack, aSource, aReadyState, aMuted,
aConstraints) {}
+ already_AddRefed<MediaStreamTrack> Clone() override;
+
AudioStreamTrack* AsAudioStreamTrack() override { return this; }
const AudioStreamTrack* AsAudioStreamTrack() const override { return this; }
@@ -38,9 +40,6 @@ class AudioStreamTrack : public MediaStreamTrack {
void GetKind(nsAString& aKind) override { aKind.AssignLiteral("audio"); }
void GetLabel(nsAString& aLabel, CallerType aCallerType) override;
-
- protected:
- already_AddRefed<MediaStreamTrack> CloneInternal() override;
};
} // namespace mozilla::dom
diff --git a/dom/media/MediaStreamTrack.cpp b/dom/media/MediaStreamTrack.cpp
@@ -539,13 +539,6 @@ void MediaStreamTrack::RemoveConsumer(MediaStreamTrackConsumer* aConsumer) {
}
}
-already_AddRefed<MediaStreamTrack> MediaStreamTrack::Clone() {
- RefPtr<MediaStreamTrack> newTrack = CloneInternal();
- newTrack->SetEnabled(Enabled());
- newTrack->SetMuted(Muted());
- return newTrack.forget();
-}
-
void MediaStreamTrack::SetReadyState(MediaStreamTrackState aState) {
MOZ_ASSERT(!(mReadyState == MediaStreamTrackState::Ended &&
aState == MediaStreamTrackState::Live),
diff --git a/dom/media/MediaStreamTrack.h b/dom/media/MediaStreamTrack.h
@@ -469,7 +469,7 @@ class MediaStreamTrack : public DOMEventTargetHelper, public SupportsWeakPtr {
already_AddRefed<Promise> ApplyConstraints(
const dom::MediaTrackConstraints& aConstraints, CallerType aCallerType,
ErrorResult& aRv);
- already_AddRefed<MediaStreamTrack> Clone();
+ virtual already_AddRefed<MediaStreamTrack> Clone() = 0;
MediaStreamTrackState ReadyState() { return mReadyState; }
IMPL_EVENT_HANDLER(mute)
@@ -642,7 +642,15 @@ class MediaStreamTrack : public DOMEventTargetHelper, public SupportsWeakPtr {
* Creates a new MediaStreamTrack with the same kind, input track, input
* track ID and source as this MediaStreamTrack.
*/
- virtual already_AddRefed<MediaStreamTrack> CloneInternal() = 0;
+
+ template <typename TrackType>
+ already_AddRefed<MediaStreamTrack> CloneInternal() {
+ auto newTrack = MakeRefPtr<TrackType>(mWindow, mInputTrack, mSource,
+ ReadyState(), Muted(), mConstraints);
+ newTrack->SetEnabled(Enabled());
+ newTrack->SetMuted(Muted());
+ return newTrack.forget();
+ }
nsTArray<PrincipalChangeObserver<MediaStreamTrack>*>
mPrincipalChangeObservers;
diff --git a/dom/media/VideoStreamTrack.cpp b/dom/media/VideoStreamTrack.cpp
@@ -74,9 +74,8 @@ void VideoStreamTrack::GetLabel(nsAString& aLabel, CallerType aCallerType) {
MediaStreamTrack::GetLabel(aLabel, aCallerType);
}
-already_AddRefed<MediaStreamTrack> VideoStreamTrack::CloneInternal() {
- return do_AddRef(new VideoStreamTrack(mWindow, mInputTrack, mSource,
- ReadyState(), Muted(), mConstraints));
+already_AddRefed<MediaStreamTrack> VideoStreamTrack::Clone() {
+ return MediaStreamTrack::CloneInternal<VideoStreamTrack>();
}
} // namespace mozilla::dom
diff --git a/dom/media/VideoStreamTrack.h b/dom/media/VideoStreamTrack.h
@@ -25,6 +25,8 @@ class VideoStreamTrack : public MediaStreamTrack {
bool aMuted = false,
const MediaTrackConstraints& aConstraints = MediaTrackConstraints());
+ already_AddRefed<MediaStreamTrack> Clone() override;
+
void Destroy() override;
VideoStreamTrack* AsVideoStreamTrack() override { return this; }
@@ -45,9 +47,6 @@ class VideoStreamTrack : public MediaStreamTrack {
void GetLabel(nsAString& aLabel, CallerType aCallerType) override;
- protected:
- already_AddRefed<MediaStreamTrack> CloneInternal() override;
-
private:
nsTArray<RefPtr<VideoOutput>> mVideoOutputs;
};