Bug 1208371 - Kill nsDOMUserMediaStream with fire. r?jib draft
authorAndreas Pehrson <pehrsons@gmail.com>
Sun, 24 Jan 2016 16:05:16 +0800
changeset 342119 12a7b93789fcad5afb766f5bb782123f3901f6da
parent 342118 52c37d3e6a4e629522034dc83a239f62cf888988
child 342120 b77b2be1ea9161fc8773f049b6a0afe072146ae2
push id13352
push userpehrsons@gmail.com
push dateFri, 18 Mar 2016 13:49:47 +0000
reviewersjib
bugs1208371
milestone47.0a1
Bug 1208371 - Kill nsDOMUserMediaStream with fire. r?jib MozReview-Commit-ID: 4KWvwqRj6Qc
dom/media/DOMMediaStream.cpp
dom/media/DOMMediaStream.h
dom/media/MediaManager.cpp
--- a/dom/media/DOMMediaStream.cpp
+++ b/dom/media/DOMMediaStream.cpp
@@ -623,16 +623,34 @@ DOMMediaStream::HasTrack(const MediaStre
 
 bool
 DOMMediaStream::OwnsTrack(const MediaStreamTrack& aTrack) const
 {
   return !!FindOwnedTrackPort(aTrack);
 }
 
 bool
+DOMMediaStream::AddDirectListener(MediaStreamDirectListener* aListener)
+{
+  if (GetInputStream() && GetInputStream()->AsSourceStream()) {
+    GetInputStream()->AsSourceStream()->AddDirectListener(aListener);
+    return true; // application should ignore NotifyQueuedTrackData
+  }
+  return false;
+}
+
+void
+DOMMediaStream::RemoveDirectListener(MediaStreamDirectListener* aListener)
+{
+  if (GetInputStream() && GetInputStream()->AsSourceStream()) {
+    GetInputStream()->AsSourceStream()->RemoveDirectListener(aListener);
+  }
+}
+
+bool
 DOMMediaStream::IsFinished()
 {
   return !mPlaybackStream || mPlaybackStream->IsFinished();
 }
 
 void
 DOMMediaStream::InitSourceStream(MediaStreamGraph* aGraph)
 {
--- a/dom/media/DOMMediaStream.h
+++ b/dom/media/DOMMediaStream.h
@@ -409,22 +409,21 @@ public:
 
   /**
    * Allows a video element to identify this stream as a camera stream, which
    * needs special treatment.
    */
   virtual MediaStream* GetCameraStream() const { return nullptr; }
 
   /**
-   * Overridden in DOMLocalMediaStreams to allow getUserMedia to pass
-   * data directly to RTCPeerConnection without going through graph queuing.
-   * Returns a bool to let us know if direct data will be delivered.
+   * Allows users to get access to media data without going through graph
+   * queuing. Returns a bool to let us know if direct data will be delivered.
    */
-  virtual bool AddDirectListener(MediaStreamDirectListener *aListener) { return false; }
-  virtual void RemoveDirectListener(MediaStreamDirectListener *aListener) {}
+  bool AddDirectListener(MediaStreamDirectListener *aListener);
+  void RemoveDirectListener(MediaStreamDirectListener *aListener);
 
   virtual DOMLocalMediaStream* AsDOMLocalMediaStream() { return nullptr; }
   virtual DOMHwMediaStream* AsDOMHwMediaStream() { return nullptr; }
 
   bool IsFinished();
   /**
    * Returns a principal indicating who may access this stream. The stream contents
    * can only be accessed by principals subsuming this principal.
--- a/dom/media/MediaManager.cpp
+++ b/dom/media/MediaManager.cpp
@@ -651,85 +651,16 @@ nsresult VideoDevice::Restart(const dom:
   return GetSource()->Restart(aConstraints, aPrefs, mID);
 }
 
 nsresult AudioDevice::Restart(const dom::MediaTrackConstraints &aConstraints,
                               const MediaEnginePrefs &aPrefs) {
   return GetSource()->Restart(aConstraints, aPrefs, mID);
 }
 
-/**
- * A subclass that we only use to stash internal pointers to MediaStreamGraph objects
- * that need to be cleaned up.
- */
-class nsDOMUserMediaStream : public DOMLocalMediaStream
-{
-public:
-  static already_AddRefed<nsDOMUserMediaStream>
-  CreateSourceStream(nsPIDOMWindowInner* aWindow,
-                     GetUserMediaCallbackMediaStreamListener* aListener,
-                     MediaStreamGraph* aMSG,
-                     MediaStreamTrackSourceGetter* aTrackSourceGetter)
-  {
-    RefPtr<nsDOMUserMediaStream> stream =
-      new nsDOMUserMediaStream(aWindow, aListener, aTrackSourceGetter);
-    stream->InitSourceStream(aMSG);
-    return stream.forget();
-  }
-
-  nsDOMUserMediaStream(nsPIDOMWindowInner* aWindow,
-                       GetUserMediaCallbackMediaStreamListener* aListener,
-                       MediaStreamTrackSourceGetter* aTrackSourceGetter) :
-    DOMLocalMediaStream(aWindow, aTrackSourceGetter),
-    mListener(aListener)
-  {}
-
-  virtual ~nsDOMUserMediaStream()
-  {
-    StopImpl();
-
-    if (GetSourceStream()) {
-      GetSourceStream()->Destroy();
-    }
-  }
-
-  // Allow getUserMedia to pass input data directly to PeerConnection/MediaPipeline
-  bool AddDirectListener(MediaStreamDirectListener *aListener) override
-  {
-    if (GetSourceStream()) {
-      GetSourceStream()->AddDirectListener(aListener);
-      return true; // application should ignore NotifyQueuedTrackData
-    }
-    return false;
-  }
-
-  void RemoveDirectListener(MediaStreamDirectListener *aListener) override
-  {
-    if (GetSourceStream()) {
-      GetSourceStream()->RemoveDirectListener(aListener);
-    }
-  }
-
-  DOMLocalMediaStream* AsDOMLocalMediaStream() override
-  {
-    return this;
-  }
-
-  SourceMediaStream* GetSourceStream()
-  {
-    if (GetInputStream()) {
-      return GetInputStream()->AsSourceStream();
-    }
-    return nullptr;
-  }
-
-  RefPtr<GetUserMediaCallbackMediaStreamListener> mListener;
-};
-
-
 void
 MediaOperationTask::ReturnCallbackError(nsresult rv, const char* errorLog)
 {
   MM_LOG(("%s , rv=%d", errorLog, rv));
   NS_DispatchToMainThread(do_AddRef(new ReleaseMediaOperationResource(mStream.forget(),
     mOnTracksAvailableCallback.forget())));
   nsString log;
 
@@ -930,17 +861,17 @@ public:
       } 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.
       domStream =
-        nsDOMUserMediaStream::CreateSourceStream(window, mListener, msg, nullptr);
+        DOMLocalMediaStream::CreateSourceStream(window, msg, nullptr);
 
       if (mPeerIdentity) {
         domStream->SetPeerIdentity(mPeerIdentity.forget());
       }
 
       if (mAudioDevice) {
         nsString audioDeviceName;
         mAudioDevice->GetName(audioDeviceName);