Backed out changeset dd79fbdfac8d (bug 1507193) for wpt failures at media-source/mediasource-seek-beyond-duration.html on a CLOSED TREE
This commit is contained in:
@@ -2804,7 +2804,8 @@ double HTMLMediaElement::CurrentTime() const {
|
||||
|
||||
void HTMLMediaElement::FastSeek(double aTime, ErrorResult& aRv) {
|
||||
LOG(LogLevel::Debug, ("%p FastSeek(%f) called by JS", this, aTime));
|
||||
Seek(aTime, SeekTarget::PrevSyncPoint, IgnoreErrors());
|
||||
RefPtr<Promise> tobeDropped =
|
||||
Seek(aTime, SeekTarget::PrevSyncPoint, IgnoreErrors());
|
||||
}
|
||||
|
||||
already_AddRefed<Promise> HTMLMediaElement::SeekToNextFrame(ErrorResult& aRv) {
|
||||
@@ -2819,23 +2820,14 @@ already_AddRefed<Promise> HTMLMediaElement::SeekToNextFrame(ErrorResult& aRv) {
|
||||
}
|
||||
}
|
||||
|
||||
Seek(CurrentTime(), SeekTarget::NextFrame, aRv);
|
||||
if (aRv.Failed()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
mSeekDOMPromise = CreateDOMPromise(aRv);
|
||||
if (NS_WARN_IF(aRv.Failed())) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return do_AddRef(mSeekDOMPromise);
|
||||
return Seek(CurrentTime(), SeekTarget::NextFrame, aRv);
|
||||
}
|
||||
|
||||
void HTMLMediaElement::SetCurrentTime(double aCurrentTime, ErrorResult& aRv) {
|
||||
LOG(LogLevel::Debug,
|
||||
("%p SetCurrentTime(%f) called by JS", this, aCurrentTime));
|
||||
Seek(aCurrentTime, SeekTarget::Accurate, IgnoreErrors());
|
||||
RefPtr<Promise> tobeDropped =
|
||||
Seek(aCurrentTime, SeekTarget::Accurate, IgnoreErrors());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2865,8 +2857,9 @@ static bool IsInRanges(TimeRanges& aRanges, double aValue,
|
||||
return false;
|
||||
}
|
||||
|
||||
void HTMLMediaElement::Seek(double aTime, SeekTarget::Type aSeekType,
|
||||
ErrorResult& aRv) {
|
||||
already_AddRefed<Promise> HTMLMediaElement::Seek(double aTime,
|
||||
SeekTarget::Type aSeekType,
|
||||
ErrorResult& aRv) {
|
||||
// Note: Seek is called both by synchronous code that expects errors thrown in
|
||||
// aRv, as well as asynchronous code that expects a promise. Make sure all
|
||||
// synchronous errors are returned using aRv, not promise rejections.
|
||||
@@ -2878,6 +2871,11 @@ void HTMLMediaElement::Seek(double aTime, SeekTarget::Type aSeekType,
|
||||
// https://html.spec.whatwg.org/multipage/media.html#dom-media-seek
|
||||
mShowPoster = false;
|
||||
|
||||
RefPtr<Promise> promise = CreateDOMPromise(aRv);
|
||||
if (NS_WARN_IF(aRv.Failed())) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Detect if user has interacted with element by seeking so that
|
||||
// play will not be blocked when initiated by a script.
|
||||
if (EventStateManager::IsHandlingUserInput()) {
|
||||
@@ -2889,7 +2887,7 @@ void HTMLMediaElement::Seek(double aTime, SeekTarget::Type aSeekType,
|
||||
if (mSrcAttrStream) {
|
||||
// do nothing since media streams have an empty Seekable range.
|
||||
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
|
||||
return;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (mPlayed && mCurrentPlayRangeStart != -1.0) {
|
||||
@@ -2908,28 +2906,28 @@ void HTMLMediaElement::Seek(double aTime, SeekTarget::Type aSeekType,
|
||||
if (mReadyState == HAVE_NOTHING) {
|
||||
mDefaultPlaybackStartPosition = aTime;
|
||||
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
|
||||
return;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (!mDecoder) {
|
||||
// mDecoder must always be set in order to reach this point.
|
||||
NS_ASSERTION(mDecoder, "SetCurrentTime failed: no decoder");
|
||||
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
|
||||
return;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Clamp the seek target to inside the seekable ranges.
|
||||
media::TimeIntervals seekableIntervals = mDecoder->GetSeekable();
|
||||
if (seekableIntervals.IsInvalid()) {
|
||||
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
|
||||
return;
|
||||
return nullptr;
|
||||
}
|
||||
RefPtr<TimeRanges> seekable =
|
||||
new TimeRanges(ToSupports(OwnerDoc()), seekableIntervals);
|
||||
uint32_t length = seekable->Length();
|
||||
if (length == 0) {
|
||||
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
|
||||
return;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// If the position we want to seek to is not in a seekable range, we seek
|
||||
@@ -2990,6 +2988,11 @@ void HTMLMediaElement::Seek(double aTime, SeekTarget::Type aSeekType,
|
||||
|
||||
// We changed whether we're seeking so we need to AddRemoveSelfReference.
|
||||
AddRemoveSelfReference();
|
||||
|
||||
// Keep the DOM promise.
|
||||
mSeekDOMPromise = promise;
|
||||
|
||||
return promise.forget();
|
||||
}
|
||||
|
||||
double HTMLMediaElement::Duration() const {
|
||||
@@ -5249,24 +5252,6 @@ void HTMLMediaElement::SeekCompleted() {
|
||||
if (IsAudioTrackCurrentlySilent()) {
|
||||
UpdateAudioTrackSilenceRange(mIsAudioTrackAudible);
|
||||
}
|
||||
|
||||
if (mSeekDOMPromise) {
|
||||
mAbstractMainThread->Dispatch(NS_NewRunnableFunction(
|
||||
__func__, [promise = std::move(mSeekDOMPromise)] {
|
||||
promise->MaybeResolveWithUndefined();
|
||||
}));
|
||||
}
|
||||
MOZ_ASSERT(!mSeekDOMPromise);
|
||||
}
|
||||
|
||||
void HTMLMediaElement::SeekAborted() {
|
||||
if (mSeekDOMPromise) {
|
||||
mAbstractMainThread->Dispatch(NS_NewRunnableFunction(
|
||||
__func__, [promise = std::move(mSeekDOMPromise)] {
|
||||
promise->MaybeReject(NS_ERROR_DOM_ABORT_ERR);
|
||||
}));
|
||||
}
|
||||
MOZ_ASSERT(!mSeekDOMPromise);
|
||||
}
|
||||
|
||||
void HTMLMediaElement::NotifySuspendedByCache(bool aSuspendedByCache) {
|
||||
@@ -7236,6 +7221,30 @@ bool HasDebuggerOrTabsPrivilege(JSContext* aCx, JSObject* aObj) {
|
||||
nsContentUtils::CallerHasPermission(aCx, nsGkAtoms::tabs);
|
||||
}
|
||||
|
||||
void HTMLMediaElement::AsyncResolveSeekDOMPromiseIfExists() {
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
if (mSeekDOMPromise) {
|
||||
RefPtr<dom::Promise> promise = mSeekDOMPromise.forget();
|
||||
nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction(
|
||||
"dom::HTMLMediaElement::AsyncResolveSeekDOMPromiseIfExists",
|
||||
[promise]() { promise->MaybeResolveWithUndefined(); });
|
||||
mAbstractMainThread->Dispatch(r.forget());
|
||||
mSeekDOMPromise = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void HTMLMediaElement::AsyncRejectSeekDOMPromiseIfExists() {
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
if (mSeekDOMPromise) {
|
||||
RefPtr<dom::Promise> promise = mSeekDOMPromise.forget();
|
||||
nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction(
|
||||
"dom::HTMLMediaElement::AsyncRejectSeekDOMPromiseIfExists",
|
||||
[promise]() { promise->MaybeReject(NS_ERROR_DOM_ABORT_ERR); });
|
||||
mAbstractMainThread->Dispatch(r.forget());
|
||||
mSeekDOMPromise = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void HTMLMediaElement::ReportCanPlayTelemetry() {
|
||||
LOG(LogLevel::Debug, ("%s", __func__));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user