Bug 1208373 - Implement MediaStreamTrack's "ended" event and onended EventHandler. r?smaug,jib
MozReview-Commit-ID: DtqzY5nIdPI
--- 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);