Bug 1452472 - Guard against stopped source and removed listener after timer fired. r?jib draft
authorAndreas Pehrson <pehrsons@mozilla.com>
Mon, 09 Apr 2018 13:53:32 +0200
changeset 779179 978a5bc48b17e61caca85b7f397797d998c0a8c2
parent 771093 7771df14ea181add1dc4133f0f5559bf620bf976
push id105681
push userbmo:apehrson@mozilla.com
push dateMon, 09 Apr 2018 11:55:51 +0000
reviewersjib
bugs1452472
milestone61.0a1
Bug 1452472 - Guard against stopped source and removed listener after timer fired. r?jib MozReview-Commit-ID: 72M3xpbOgXP
dom/media/MediaManager.cpp
--- 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