Bug 1371719 - Don't create a MediaStreamGraph without doing anything with it. r=jesup

The MediaStreamGraph relies on having at least one message sent to its message
queue on creation, or it will just sit there and do nothing, and block shutdown
because its not running its rendering loop, so it's not progressing in the
MediaStreamGraph life cycle state machine.

This patch makes sure the `captureStream` will succeed before creating an MSG.

MozReview-Commit-ID: CN1arWydmxC
This commit is contained in:
Paul Adenot
2017-06-28 15:19:39 -07:00
parent 7a539b407c
commit 0a1b1a9c7b
2 changed files with 47 additions and 8 deletions

View File

@@ -3399,24 +3399,34 @@ HTMLMediaElement::AddCaptureMediaTrackToOutputStream(MediaTrack* aTrack,
track.get(), destinationTrackID, inputTrack, port.get()));
}
bool
HTMLMediaElement::CanBeCaptured(bool aCaptureAudio)
{
// Don't bother capturing when the document has gone away
nsPIDOMWindowInner* window = OwnerDoc()->GetInnerWindow();
if (!window) {
return false;
}
// Prevent capturing restricted video
if (!aCaptureAudio && ContainsRestrictedContent()) {
return false;
}
return true;
}
already_AddRefed<DOMMediaStream>
HTMLMediaElement::CaptureStreamInternal(bool aFinishWhenEnded,
bool aCaptureAudio,
MediaStreamGraph* aGraph)
{
MOZ_RELEASE_ASSERT(aGraph);
MOZ_ASSERT(CanBeCaptured(aCaptureAudio));
MarkAsContentSource(CallerAPI::CAPTURE_STREAM);
MarkAsTainted();
nsPIDOMWindowInner* window = OwnerDoc()->GetInnerWindow();
if (!window) {
return nullptr;
}
if (!aCaptureAudio && ContainsRestrictedContent()) {
return nullptr;
}
// We don't support routing to a different graph.
if (!mOutputStreams.IsEmpty() &&
aGraph != mOutputStreams[0].mStream->GetInputStream()->Graph()) {
return nullptr;
@@ -3424,6 +3434,7 @@ HTMLMediaElement::CaptureStreamInternal(bool aFinishWhenEnded,
OutputMediaStream* out = mOutputStreams.AppendElement();
MediaStreamTrackSourceGetter* getter = new CaptureStreamTrackSourceGetter(this);
nsPIDOMWindowInner* window = OwnerDoc()->GetInnerWindow();
out->mStream = DOMMediaStream::CreateTrackUnionStreamAsInput(window, aGraph, getter);
out->mStream->SetInactiveOnFinish();
out->mFinishWhenEnded = aFinishWhenEnded;
@@ -3530,6 +3541,19 @@ HTMLMediaElement::MozCaptureStream(ErrorResult& aRv)
MediaStreamGraph::GraphDriverType graphDriverType =
HasAudio() ? MediaStreamGraph::AUDIO_THREAD_DRIVER
: MediaStreamGraph::SYSTEM_THREAD_DRIVER;
nsPIDOMWindowInner* window = OwnerDoc()->GetInnerWindow();
if (!window) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
if (!CanBeCaptured(false)) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
MediaStreamGraph* graph =
MediaStreamGraph::GetInstance(graphDriverType, mAudioChannel);
@@ -3549,6 +3573,18 @@ HTMLMediaElement::MozCaptureStreamUntilEnded(ErrorResult& aRv)
MediaStreamGraph::GraphDriverType graphDriverType =
HasAudio() ? MediaStreamGraph::AUDIO_THREAD_DRIVER
: MediaStreamGraph::SYSTEM_THREAD_DRIVER;
nsPIDOMWindowInner* window = OwnerDoc()->GetInnerWindow();
if (!window) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
if (!CanBeCaptured(false)) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
MediaStreamGraph* graph =
MediaStreamGraph::GetInstance(graphDriverType, mAudioChannel);