Bug 1208373 - Implement MediaStreamTrack's "ended" event and onended EventHandler. r?smaug,jib draft
authorAndreas Pehrson <pehrsons@gmail.com>
Tue, 10 May 2016 17:03:29 +0200
changeset 376729 c30697044c1e6a98c19295b417c0b925f323f069
parent 376728 459b42dee0e4671dfde23e85417ca167c5785ddf
child 376730 25406fd0160084b7430ad8b7c65fd3b434e183d3
push id20652
push userpehrsons@gmail.com
push dateWed, 08 Jun 2016 15:10:47 +0000
reviewerssmaug, jib
bugs1208373
milestone50.0a1
Bug 1208373 - Implement MediaStreamTrack's "ended" event and onended EventHandler. r?smaug,jib MozReview-Commit-ID: DtqzY5nIdPI
dom/media/MediaStreamTrack.cpp
dom/media/MediaStreamTrack.h
dom/webidl/MediaStreamTrack.webidl
--- a/dom/media/MediaStreamTrack.cpp
+++ b/dom/media/MediaStreamTrack.cpp
@@ -345,16 +345,32 @@ MediaStreamTrack::Clone()
 
   MediaStreamGraph* graph = Graph();
   newStream->InitOwnedStreamCommon(graph);
   newStream->InitPlaybackStreamCommon(graph);
 
   return newStream->CloneDOMTrack(*this, mTrackID);
 }
 
+void
+MediaStreamTrack::NotifyEnded()
+{
+  MOZ_ASSERT(NS_IsMainThread());
+
+  if (mEnded) {
+    return;
+  }
+
+  LOG(LogLevel::Info, ("MediaStreamTrack %p ended", this));
+
+  mEnded = true;
+
+  DispatchTrustedEvent(NS_LITERAL_STRING("ended"));
+}
+
 DOMMediaStream*
 MediaStreamTrack::GetInputDOMStream()
 {
   MediaStreamTrack* originalTrack =
     mOriginalTrack ? mOriginalTrack.get() : this;
   MOZ_RELEASE_ASSERT(originalTrack->mOwningStream);
   return originalTrack->mOwningStream;
 }
--- a/dom/media/MediaStreamTrack.h
+++ b/dom/media/MediaStreamTrack.h
@@ -262,19 +262,28 @@ public:
   void GetLabel(nsAString& aLabel) { GetSource().GetLabel(aLabel); }
   bool Enabled() { return mEnabled; }
   void SetEnabled(bool aEnabled);
   void Stop();
   already_AddRefed<Promise>
   ApplyConstraints(const dom::MediaTrackConstraints& aConstraints, ErrorResult &aRv);
   already_AddRefed<MediaStreamTrack> Clone();
 
+  IMPL_EVENT_HANDLER(ended)
+
   bool Ended() const { return mEnded; }
-  // Notifications from the MediaStreamGraph
-  void NotifyEnded() { mEnded = true; }
+
+  /**
+   * Notified by the MediaStreamGraph, through our owning MediaStream on the
+   * main thread.
+   *
+   * Note that this sets the track to ended and raises the "ended" event
+   * synchronously.
+   */
+  void NotifyEnded();
 
   /**
    * Get this track's principal.
    */
   nsIPrincipal* GetPrincipal() const { return mPrincipal; }
 
   /**
    * Called by the PrincipalHandleListener when this track's PrincipalHandle changes on
--- a/dom/webidl/MediaStreamTrack.webidl
+++ b/dom/webidl/MediaStreamTrack.webidl
@@ -70,17 +70,17 @@ interface MediaStreamTrack : EventTarget
     readonly    attribute DOMString             label;
                 attribute boolean               enabled;
 //  readonly    attribute boolean               muted;
 //              attribute EventHandler          onmute;
 //              attribute EventHandler          onunmute;
 //  readonly    attribute boolean               _readonly;
 //  readonly    attribute boolean               remote;
 //  readonly    attribute MediaStreamTrackState readyState;
-//                attribute EventHandler          onended;
+                attribute EventHandler          onended;
     MediaStreamTrack       clone ();
     void                   stop ();
 //  MediaTrackCapabilities getCapabilities ();
 //  MediaTrackConstraints  getConstraints ();
 //  MediaTrackSettings     getSettings ();
 
     [Throws]
     Promise<void>          applyConstraints (optional MediaTrackConstraints constraints);