Bug 1259236 - throw NotSupportedError on pc.addTrack of track in constructed stream. draft
authorJan-Ivar Bruaroey <jib@mozilla.com>
Thu, 24 Mar 2016 12:45:22 -0400
changeset 344441 a036d65d2a28bd5f2b00b99083e997c3ba711db8
parent 342671 f14898695ee0dd14615914f3e1401f17df57fdd7
child 344447 043e28abebdb1aee4476e64c40ac4a564f3ed1bb
child 344448 c74a49b6934fc53e4ceeedf4a28338854718cf33
child 344512 09174a9809dc0090bd8c16b127ffb66963e2ed42
push id13818
push userjbruaroey@mozilla.com
push dateThu, 24 Mar 2016 16:46:11 +0000
bugs1259236
milestone48.0a1
Bug 1259236 - throw NotSupportedError on pc.addTrack of track in constructed stream. MozReview-Commit-ID: LBP9CybRmrI
dom/media/PeerConnection.js
media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp
media/webrtc/signaling/test/FakeMediaStreams.h
--- a/dom/media/PeerConnection.js
+++ b/dom/media/PeerConnection.js
@@ -1055,17 +1055,23 @@ RTCPeerConnection.prototype = {
     }
     this._checkClosed();
     this._senders.forEach(sender => {
       if (sender.track == track) {
         throw new this._win.DOMException("already added.",
                                          "InvalidParameterError");
       }
     });
-    this._impl.addTrack(track, stream);
+    try {
+      this._impl.addTrack(track, stream);
+    } catch (e if (e.result == Cr.NS_ERROR_NOT_IMPLEMENTED)) {
+      throw new this._win.DOMException(
+          "track in constructed stream not yet supported (see Bug 1259236).",
+          "NotSupportedError");
+    }
     let sender = this._win.RTCRtpSender._create(this._win,
                                                 new RTCRtpSender(this, track,
                                                                  stream));
     this._senders.push(sender);
     return sender;
   },
 
   removeTrack: function(sender) {
--- a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp
+++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp
@@ -2203,16 +2203,20 @@ PeerConnectionImpl::AddTrack(MediaStream
 nsresult
 PeerConnectionImpl::AddTrack(MediaStreamTrack& aTrack,
                              DOMMediaStream& aMediaStream)
 {
   if (!aMediaStream.HasTrack(aTrack)) {
     CSFLogError(logTag, "%s: Track is not in stream", __FUNCTION__);
     return NS_ERROR_FAILURE;
   }
+  if (!aMediaStream.OwnsTrack(aTrack)) {
+    CSFLogError(logTag, "%s: Track is not in owned stream (Bug 1259236)", __FUNCTION__);
+    return NS_ERROR_NOT_IMPLEMENTED;
+  }
   uint32_t num = mMedia->LocalStreamsLength();
 
   std::string streamId = PeerConnectionImpl::GetStreamId(aMediaStream);
   std::string trackId = PeerConnectionImpl::GetTrackId(aTrack);
   nsresult res = mMedia->AddTrack(&aMediaStream, streamId, trackId);
   if (NS_FAILED(res)) {
     return res;
   }
--- a/media/webrtc/signaling/test/FakeMediaStreams.h
+++ b/media/webrtc/signaling/test/FakeMediaStreams.h
@@ -409,16 +409,22 @@ public:
 
   bool
   HasTrack(const Fake_MediaStreamTrack& aTrack) const
   {
     return ((mHintContents & HINT_CONTENTS_AUDIO) && aTrack.AsAudioStreamTrack()) ||
            ((mHintContents & HINT_CONTENTS_VIDEO) && aTrack.AsVideoStreamTrack());
   }
 
+  bool
+  OwnsTrack(const Fake_MediaStreamTrack& aTrack) const
+  {
+    return HasTrack(aTrack);
+  }
+
   void SetTrackEnabled(mozilla::TrackID aTrackID, bool aEnabled) {}
 
   Fake_MediaStreamTrack*
   CreateOwnDOMTrack(mozilla::TrackID aTrackID, mozilla::MediaSegment::Type aType)
   {
     switch(aType) {
       case mozilla::MediaSegment::AUDIO: {
         return mAudioTrack;