Bug1322505 - part2 : reset suspend type for blocked media after calling media.pause(). draft
authorAlastor Wu <alwu@mozilla.com>
Thu, 29 Dec 2016 15:52:17 +0800
changeset 454393 6df930ff2be2db58532083b840bf6ed0252fc2d4
parent 454356 950ce998c9329761c91058342808c662caa1eeb2
child 454394 9cdf758dc6e2b81315146b7e241847d3066ecfb8
push id39914
push useralwu@mozilla.com
push dateThu, 29 Dec 2016 07:52:33 +0000
bugs1322505
milestone53.0a1
Bug1322505 - part2 : reset suspend type for blocked media after calling media.pause(). If the blocked media is paused before resuming it, we should not resume it again after the tab is visible. The way to achieve that is to unregister the agent so AudioChannelService can't resume that media because we have disconnected their relationship. MozReview-Commit-ID: Bm4eg5UnOVN
dom/html/HTMLMediaElement.cpp
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -649,25 +649,41 @@ public:
         return;
       }
 
       mPlayingThroughTheAudioChannel = playingThroughTheAudioChannel;
       NotifyAudioChannelAgent(mPlayingThroughTheAudioChannel);
     }
   }
 
+  bool ShouldResetSuspend() const
+  {
+    // The disposable-pause should be clear after media starts playing.
+    if (!mOwner->Paused() &&
+        mSuspended == nsISuspendedTypes::SUSPENDED_PAUSE_DISPOSABLE) {
+      return true;
+    }
+
+    // If the blocked media is paused, we don't need to resume it. We reset the
+    // mSuspended in order to unregister the agent.
+    if (mOwner->Paused() &&
+        mSuspended == nsISuspendedTypes::SUSPENDED_BLOCK) {
+      return true;
+    }
+
+    return false;
+  }
+
   void
   NotifyPlayStateChanged()
   {
     MOZ_ASSERT(!mIsShutDown);
-    // When owner's play state changed, we should reset the suspend type. If
-    // owner is playing, the suspend type should be 'NONE_SUSPENDED', and if
-    // owner paused, the suspend type also needs to be reset because the agent
-    // maybe need to be unregistered.
-    SetSuspended(nsISuspendedTypes::NONE_SUSPENDED);
+    if (ShouldResetSuspend()) {
+      SetSuspended(nsISuspendedTypes::NONE_SUSPENDED);
+    }
     UpdateAudioChannelPlayingState();
   }
 
   NS_IMETHODIMP
   WindowVolumeChanged(float aVolume, bool aMuted) override
   {
     MOZ_ASSERT(mAudioChannelAgent);
 
@@ -876,17 +892,17 @@ private:
   }
 
   void
   Resume()
   {
     if (!IsSuspended()) {
       MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
              ("HTMLMediaElement::AudioChannelAgentCallback, ResumeFromAudioChannel, "
-              "this = %p, Error : resume without suspended!\n", this));
+              "this = %p, don't need to be resumed!\n", this));
       return;
     }
 
     SetSuspended(nsISuspendedTypes::NONE_SUSPENDED);
     nsresult rv = mOwner->Play();
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return;
     }
@@ -2751,17 +2767,19 @@ HTMLMediaElement::Pause(ErrorResult& aRv
   }
 
   bool oldPaused = mPaused;
   mPaused = true;
   mAutoplaying = false;
   // We changed mPaused and mAutoplaying which can affect AddRemoveSelfReference
   AddRemoveSelfReference();
   UpdateSrcMediaStreamPlaying();
-  UpdateAudioChannelPlayingState();
+  if (mAudioChannelWrapper) {
+    mAudioChannelWrapper->NotifyPlayStateChanged();
+  }
 
   if (!oldPaused) {
     FireTimeUpdate(false);
     DispatchAsyncEvent(NS_LITERAL_STRING("pause"));
     AsyncRejectPendingPlayPromises(NS_ERROR_DOM_MEDIA_ABORT_ERR);
   }
 }