Bug 1452472 - Guard against stopped source and removed listener after timer fired. r?jib
MozReview-Commit-ID: 72M3xpbOgXP
--- a/dom/media/MediaManager.cpp
+++ b/dom/media/MediaManager.cpp
@@ -4175,16 +4175,26 @@ SourceListener::SetEnabledFor(TrackID aT
MOZ_ASSERT(state.mOperationInProgress,
"It's our responsibility to reset the inProgress state");
LOG(("SourceListener %p %s %s track %d - starting device operation",
this, aEnable ? "enabling" : "disabling",
aTrackID == kAudioTrack ? "audio" : "video",
aTrackID));
+ if (mRemoved) {
+ // Listener was removed between timer resolving and this runnable.
+ return DeviceOperationPromise::CreateAndResolve(NS_ERROR_ABORT, __func__);
+ }
+
+ if (state.mStopped) {
+ // Source was stopped between timer resolving and this runnable.
+ return DeviceOperationPromise::CreateAndResolve(NS_ERROR_ABORT, __func__);
+ }
+
state.mDeviceEnabled = aEnable;
if (mWindowListener) {
mWindowListener->ChromeAffectingStateChanged();
}
if (!state.mOffWhileDisabled) {
// If the feature to turn a device off while disabled is itself disabled