Bug 1466500 - Update AudioContext.{suspend, resume} to match the spec. r?karlt
MozReview-Commit-ID: XQX2D4Oh51
--- 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;