Bug 1466500 - Update AudioContext.{suspend, resume} to match the spec. r?karlt draft
authorPaul Adenot <paul@paul.cx>
Mon, 11 Jun 2018 16:56:43 -0700
changeset 806784 6421c1847d56082b2c75140b6e045c7e31b24c45
parent 806783 536188bf8c77f72da7780c7ab4466a343a129ea5
push id112957
push userpaul@paul.cx
push dateMon, 11 Jun 2018 23:56:57 +0000
reviewerskarlt
bugs1466500
milestone62.0a1
Bug 1466500 - Update AudioContext.{suspend, resume} to match the spec. r?karlt MozReview-Commit-ID: XQX2D4Oh51
dom/media/webaudio/AudioContext.cpp
dom/media/webaudio/test/test_audioContextSuspendResumeClose.html
--- a/dom/media/webaudio/AudioContext.cpp
+++ b/dom/media/webaudio/AudioContext.cpp
@@ -974,16 +974,21 @@ AudioContext::Suspend(ErrorResult& aRv)
   }
 
   if (mAudioContextState == AudioContextState::Closed ||
       mCloseCalled) {
     promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR);
     return promise.forget();
   }
 
+  if (mAudioContextState == AudioContextState::Suspended) {
+    promise->MaybeResolveWithUndefined();
+    return promise.forget();
+  }
+
   Destination()->Suspend();
 
   mPromiseGripArray.AppendElement(promise);
 
   nsTArray<MediaStream*> streams;
   // If mSuspendCalled is true then we already suspended all our streams,
   // so don't suspend them again (since suspend(); suspend(); resume(); should
   // cancel both suspends). But we still need to do ApplyAudioContextOperation
@@ -1016,16 +1021,21 @@ AudioContext::Resume(ErrorResult& aRv)
   }
 
   if (mAudioContextState == AudioContextState::Closed ||
       mCloseCalled) {
     promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR);
     return promise.forget();
   }
 
+  if (mAudioContextState == AudioContextState::Running) {
+    promise->MaybeResolveWithUndefined();
+    return promise.forget();
+  }
+
   mPendingResumePromises.AppendElement(promise);
 
   if (AutoplayPolicy::IsAudioContextAllowedToPlay(WrapNotNull(this))) {
     Destination()->Resume();
 
     nsTArray<MediaStream*> streams;
     // If mSuspendCalled is false then we already resumed all our streams,
     // so don't resume them again (since suspend(); resume(); resume(); should
--- a/dom/media/webaudio/test/test_audioContextSuspendResumeClose.html
+++ b/dom/media/webaudio/test/test_audioContextSuspendResumeClose.html
@@ -364,21 +364,21 @@ function testOfflineAudioContext() {
 function testSuspendResumeEventLoop() {
   var ac = new AudioContext();
   var source = ac.createBufferSource();
   source.buffer = ac.createBuffer(1, 44100, 44100);
   source.onended = function() {
     ok(true, "The AudioContext did resume.");
     finish();
   }
-  ac.onstatechange = function() {
+  ac.onstatechange = async function() {
     ac.onstatechange = null;
 
     ok(ac.state == "running", "initial state is running");
-    ac.suspend();
+    await ac.suspend();
     source.start();
     ac.resume();
   }
 }
 
 function testResumeInStateChangeForResumeCallback() {
   // Regression test for bug 1468085.
   var ac = new AudioContext;