commit 1f4c1dae040f99d7a89cc3d7cd0e144bd4377a3f
parent a6f907d2143c15b3e89fd18ddc2a7f42e16e0c02
Author: Andrew Osmond <aosmond@gmail.com>
Date: Wed, 7 Jan 2026 14:31:36 +0000
Bug 1976929 - Don't assume MediaChangeMonitor::mDecodePromise is set after dispatching. r=media-playback-reviewers,padenot
Since the owner can call MediaChangeMonitor::Shutdown and reject any
outstanding promises, we shouldn't assume mDecodePromise will still be
set in any promise chains after dispatching. This will allow us to
shutdown gracefully.
Differential Revision: https://phabricator.services.mozilla.com/D278077
Diffstat:
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/dom/media/platforms/wrappers/MediaChangeMonitor.cpp b/dom/media/platforms/wrappers/MediaChangeMonitor.cpp
@@ -1205,7 +1205,7 @@ MediaResult MediaChangeMonitor::CreateDecoderAndInit(MediaRawData* aSample) {
return;
}
- mDecodePromise.Reject(
+ mDecodePromise.RejectIfExists(
MediaResult(
aError.Code(),
RESULT_DETAIL("Unable to initialize decoder")),
@@ -1220,7 +1220,7 @@ MediaResult MediaChangeMonitor::CreateDecoderAndInit(MediaRawData* aSample) {
mFlushPromise.Reject(aError, __func__);
return;
}
- mDecodePromise.Reject(
+ mDecodePromise.RejectIfExists(
MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
RESULT_DETAIL("Unable to create decoder")),
__func__);
@@ -1264,12 +1264,12 @@ void MediaChangeMonitor::DecodeFirstSample(MediaRawData* aSample) {
[self, this](MediaDataDecoder::DecodedData&& aResults) {
mDecodePromiseRequest.Complete();
mPendingFrames.AppendElements(std::move(aResults));
- mDecodePromise.Resolve(std::move(mPendingFrames), __func__);
+ mDecodePromise.ResolveIfExists(std::move(mPendingFrames), __func__);
mPendingFrames = DecodedData();
},
[self, this](const MediaResult& aError) {
mDecodePromiseRequest.Complete();
- mDecodePromise.Reject(aError, __func__);
+ mDecodePromise.RejectIfExists(aError, __func__);
})
->Track(mDecodePromiseRequest);
}
@@ -1328,7 +1328,7 @@ void MediaChangeMonitor::DrainThenFlushDecoder(MediaRawData* aPendingSample) {
mFlushPromise.Reject(aError, __func__);
return;
}
- mDecodePromise.Reject(aError, __func__);
+ mDecodePromise.RejectIfExists(aError, __func__);
})
->Track(mDrainRequest);
}
@@ -1372,7 +1372,7 @@ void MediaChangeMonitor::FlushThenShutdownDecoder(
return;
}
MOZ_ASSERT(NS_FAILED(rv));
- mDecodePromise.Reject(rv, __func__);
+ mDecodePromise.RejectIfExists(rv, __func__);
return;
},
[] { MOZ_CRASH("Can't reach here'"); })
@@ -1385,7 +1385,7 @@ void MediaChangeMonitor::FlushThenShutdownDecoder(
mFlushPromise.Reject(aError, __func__);
return;
}
- mDecodePromise.Reject(aError, __func__);
+ mDecodePromise.RejectIfExists(aError, __func__);
})
->Track(mFlushRequest);
}