Bug 1588840 - Make ended return true after reaching the event loop's step 1 when playing a MediaStream. r=jib

This is especially important for media elements playing MediaStreams, since the
streams can be manipulated to end playback of the elements synchronously by
either stopping or removing their tracks.

Differential Revision: https://phabricator.services.mozilla.com/D49385
This commit is contained in:
Andreas Pehrson
2019-11-06 13:06:44 +00:00
parent a565fa3e14
commit af1f8096ad
2 changed files with 27 additions and 1 deletions

View File

@@ -1810,7 +1810,7 @@ void HTMLMediaElement::SetSrcObject(DOMMediaStream* aValue) {
bool HTMLMediaElement::Ended() {
return (mDecoder && mDecoder->IsEnded()) ||
(mSrcStream && mSrcStreamPlaybackEnded);
(mSrcStream && mSrcStreamReportPlaybackEnded);
}
void HTMLMediaElement::GetCurrentSrc(nsAString& aCurrentSrc) {
@@ -4787,6 +4787,7 @@ class HTMLMediaElement::MediaStreamTrackListener
}
LOG(LogLevel::Debug, ("%p, mSrcStream %p became inactive", mElement.get(),
mElement->mSrcStream.get()));
mElement->PlaybackEnded();
mElement->UpdateReadyStateInternal();
}
@@ -4839,6 +4840,7 @@ void HTMLMediaElement::UpdateSrcMediaStreamPlaying(uint32_t aFlags) {
if (shouldPlay) {
mSrcStreamPlaybackEnded = false;
mSrcStreamReportPlaybackEnded = false;
if (mMediaStreamRenderer) {
mMediaStreamRenderer->Start();
@@ -4915,6 +4917,8 @@ void HTMLMediaElement::SetupSrcMediaStreamPlayback(DOMMediaStream* aStream) {
&HTMLMediaElement::UpdateSrcStreamPotentiallyPlaying);
mWatchManager.Watch(mSrcStreamPlaybackEnded,
&HTMLMediaElement::UpdateSrcStreamPotentiallyPlaying);
mWatchManager.Watch(mSrcStreamPlaybackEnded,
&HTMLMediaElement::UpdateSrcStreamReportPlaybackEnded);
mWatchManager.Watch(mMediaStreamRenderer->CurrentGraphTime(),
&HTMLMediaElement::UpdateSrcStreamTime);
SetVolumeInternal();
@@ -4962,6 +4966,9 @@ void HTMLMediaElement::EndSrcMediaStreamPlayback() {
&HTMLMediaElement::UpdateSrcStreamPotentiallyPlaying);
mWatchManager.Unwatch(mSrcStreamPlaybackEnded,
&HTMLMediaElement::UpdateSrcStreamPotentiallyPlaying);
mWatchManager.Unwatch(
mSrcStreamPlaybackEnded,
&HTMLMediaElement::UpdateSrcStreamReportPlaybackEnded);
mWatchManager.Unwatch(mMediaStreamRenderer->CurrentGraphTime(),
&HTMLMediaElement::UpdateSrcStreamTime);
mMediaStreamRenderer->Shutdown();
@@ -4972,6 +4979,7 @@ void HTMLMediaElement::EndSrcMediaStreamPlayback() {
mMediaStreamTrackListener = nullptr;
mSrcStreamTracksAvailable = false;
mSrcStreamPlaybackEnded = false;
mSrcStreamReportPlaybackEnded = false;
mSrcStreamVideoPrincipal = nullptr;
#ifdef DEBUG
@@ -5304,6 +5312,10 @@ void HTMLMediaElement::PlaybackEnded() {
DispatchAsyncEvent(NS_LITERAL_STRING("ended"));
}
void HTMLMediaElement::UpdateSrcStreamReportPlaybackEnded() {
mSrcStreamReportPlaybackEnded = mSrcStreamPlaybackEnded;
}
void HTMLMediaElement::SeekStarted() {
DispatchAsyncEvent(NS_LITERAL_STRING("seeking"));
}