tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit b87eb945be9c3e75d24cbedea106847922856c9d
parent bfd77462f060276f354c3b9afb87ea42d1fc46fc
Author: Andreas Pehrson <apehrson@mozilla.com>
Date:   Tue, 11 Nov 2025 08:20:21 +0000

Bug 1771789 - Add and use an API for MediaStreamTrackSource cloning. r=jib

Note, no sources implement it yet.

Differential Revision: https://phabricator.services.mozilla.com/D266381

Diffstat:
Mdom/media/MediaStreamTrack.cpp | 2++
Mdom/media/MediaStreamTrack.h | 23+++++++++++++++++++++--
2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/dom/media/MediaStreamTrack.cpp b/dom/media/MediaStreamTrack.cpp @@ -46,6 +46,8 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(MediaStreamTrackSource) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPrincipal) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END +auto MediaStreamTrackSource::Clone() -> CloneResult { return {}; } + auto MediaStreamTrackSource::ApplyConstraints( const dom::MediaTrackConstraints& aConstraints, CallerType aCallerType) -> RefPtr<ApplyConstraintsPromise> { diff --git a/dom/media/MediaStreamTrack.h b/dom/media/MediaStreamTrack.h @@ -128,6 +128,18 @@ class MediaStreamTrackSource : public nsISupports { */ virtual void Destroy() {} + struct CloneResult { + RefPtr<MediaStreamTrackSource> mSource; + RefPtr<mozilla::MediaTrack> mInputTrack; + }; + + /** + * Clone this MediaStreamTrackSource. Cloned sources allow independent track + * settings. Not supported by all source types. A source not supporting + * cloning returns nullptr. + */ + virtual CloneResult Clone(); + /** * Gets the source's MediaSourceEnum for usage by PeerConnections. */ @@ -645,8 +657,15 @@ class MediaStreamTrack : public DOMEventTargetHelper, public SupportsWeakPtr { template <typename TrackType> already_AddRefed<MediaStreamTrack> CloneInternal() { - auto newTrack = MakeRefPtr<TrackType>(mWindow, mInputTrack, mSource, - ReadyState(), Muted(), mConstraints); + auto cloneRes = mSource->Clone(); + MOZ_ASSERT(!!cloneRes.mSource == !!cloneRes.mInputTrack); + if (!cloneRes.mSource || !cloneRes.mInputTrack) { + cloneRes.mSource = mSource; + cloneRes.mInputTrack = mInputTrack; + } + auto newTrack = + MakeRefPtr<TrackType>(mWindow, cloneRes.mInputTrack, cloneRes.mSource, + ReadyState(), Muted(), mConstraints); newTrack->SetEnabled(Enabled()); newTrack->SetMuted(Muted()); return newTrack.forget();