Bug 1286810: [MSE] P1. Error on abort() during Range Removals. r?gerald
As per https://github.com/w3c/media-source/issues/26
MozReview-Commit-ID: 1rNKVTBDjFY
--- a/dom/media/mediasource/SourceBuffer.cpp
+++ b/dom/media/mediasource/SourceBuffer.cpp
@@ -187,16 +187,20 @@ SourceBuffer::Abort(ErrorResult& aRv)
if (!IsAttached()) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return;
}
if (mMediaSource->ReadyState() != MediaSourceReadyState::Open) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return;
}
+ if (mPendingRemoval.Exists()) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
AbortBufferAppend();
ResetParserState();
mCurrentAttributes.SetAppendWindowStart(0);
mCurrentAttributes.SetAppendWindowEnd(PositiveInfinity<double>());
}
void
SourceBuffer::AbortBufferAppend()
@@ -243,21 +247,25 @@ SourceBuffer::Remove(double aStart, doub
}
void
SourceBuffer::RangeRemoval(double aStart, double aEnd)
{
StartUpdating();
RefPtr<SourceBuffer> self = this;
- mTrackBuffersManager->RangeRemoval(TimeUnit::FromSeconds(aStart),
- TimeUnit::FromSeconds(aEnd))
- ->Then(AbstractThread::MainThread(), __func__,
- [self] (bool) { self->StopUpdating(); },
- []() { MOZ_ASSERT(false); });
+ mPendingRemoval.Begin(
+ mTrackBuffersManager->RangeRemoval(TimeUnit::FromSeconds(aStart),
+ TimeUnit::FromSeconds(aEnd))
+ ->Then(AbstractThread::MainThread(), __func__,
+ [self] (bool) {
+ self->mPendingRemoval.Complete();
+ self->StopUpdating();
+ },
+ []() { MOZ_ASSERT(false); }));
}
void
SourceBuffer::Detach()
{
MOZ_ASSERT(NS_IsMainThread());
MSE_DEBUG("Detach");
if (!mMediaSource) {
--- a/dom/media/mediasource/SourceBuffer.h
+++ b/dom/media/mediasource/SourceBuffer.h
@@ -169,16 +169,17 @@ private:
RefPtr<TrackBuffersManager> mTrackBuffersManager;
SourceBufferAttributes mCurrentAttributes;
bool mUpdating;
mozilla::Atomic<bool> mActive;
MozPromiseRequestHolder<SourceBufferTask::AppendPromise> mPendingAppend;
+ MozPromiseRequestHolder<SourceBufferTask::RangeRemovalPromise> mPendingRemoval;
const nsCString mType;
RefPtr<TimeRanges> mBuffered;
};
} // namespace dom
} // namespace mozilla