Bug 1208371 - Add a track getter to gUM for fake tracks. r?jib
MozReview-Commit-ID: 8kc4ehGFBX7
--- a/dom/media/MediaManager.cpp
+++ b/dom/media/MediaManager.cpp
@@ -671,16 +671,57 @@ MediaOperationTask::ReturnCallbackError(
NS_DispatchToMainThread(do_AddRef(
new ErrorCallbackRunnable<nsIDOMGetUserMediaSuccessCallback>(onSuccess,
mOnFailure,
*error,
mWindowID)));
}
/**
+ * This class is only needed since fake tracks are added dynamically.
+ * Instead of refactoring to add them explicitly we let the DOMMediaStream
+ * query us for the source as they become available.
+ * Since they are used only for testing the API surface, we make them very
+ * simple.
+ */
+class FakeTrackSourceGetter : public MediaStreamTrackSourceGetter
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(FakeTrackSourceGetter,
+ MediaStreamTrackSourceGetter)
+
+ explicit FakeTrackSourceGetter(nsIPrincipal* aPrincipal)
+ : mPrincipal(aPrincipal) {}
+
+ already_AddRefed<dom::MediaStreamTrackSource>
+ GetMediaStreamTrackSource(TrackID aInputTrackID) override
+ {
+ NS_ASSERTION(kAudioTrack != aInputTrackID,
+ "Only fake tracks should appear dynamically");
+ NS_ASSERTION(kVideoTrack != aInputTrackID,
+ "Only fake tracks should appear dynamically");
+ return do_AddRef(new BasicUnstoppableTrackSource(mPrincipal));
+ }
+
+protected:
+ virtual ~FakeTrackSourceGetter() {}
+
+ nsCOMPtr<nsIPrincipal> mPrincipal;
+};
+
+NS_IMPL_ADDREF_INHERITED(FakeTrackSourceGetter, MediaStreamTrackSourceGetter)
+NS_IMPL_RELEASE_INHERITED(FakeTrackSourceGetter, MediaStreamTrackSourceGetter)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(FakeTrackSourceGetter)
+NS_INTERFACE_MAP_END_INHERITING(MediaStreamTrackSourceGetter)
+NS_IMPL_CYCLE_COLLECTION_INHERITED(FakeTrackSourceGetter,
+ MediaStreamTrackSourceGetter,
+ mPrincipal)
+
+/**
* Creates a MediaStream, attaches a listener and fires off a success callback
* to the DOM with the stream. We also pass in the error callback so it can
* be released correctly.
*
* All of this must be done on the main thread!
*
* Note that the various GetUserMedia Runnable classes currently allow for
* two streams. If we ever need to support getting more than two streams
@@ -865,20 +906,21 @@ public:
nsCOMPtr<nsIPrincipal> principal;
if (mPeerIdentity) {
principal = nsNullPrincipal::Create();
} else {
principal = window->GetExtantDoc()->NodePrincipal();
}
// Normal case, connect the source stream to the track union stream to
- // avoid us blocking. Pass a null TrackSourceGetter since gUM should never
- // add tracks dynamically.
+ // avoid us blocking. Pass a simple TrackSourceGetter for potential
+ // fake tracks. Apart from them gUM never adds tracks dynamically.
domStream =
- DOMLocalMediaStream::CreateSourceStream(window, msg, nullptr);
+ DOMLocalMediaStream::CreateSourceStream(window, msg,
+ new FakeTrackSourceGetter(principal));
if (mAudioDevice) {
nsString audioDeviceName;
mAudioDevice->GetName(audioDeviceName);
const MediaSourceEnum source =
mAudioDevice->GetSource()->GetMediaSource();
RefPtr<MediaStreamTrackSource> audioSource =
new LocalTrackSource(principal, mListener, source, kAudioTrack,