blob: b9d1dabc6d1c771263cd46c0489b9181272dfc30 [file] [log] [blame]
<!DOCTYPE html>
<html>
<body>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script>
promise_test(async (t) => {
if (!window.internals)
return;
internals.setMediaSessionRestrictions("WebAudio", "backgroundprocessplaybackrestricted");
// Regular context who is setting its destination upfront, it should be interrupted/uninterrupted following background interruptions.
var context1 = new AudioContext;
// Context who is setting its destination to a media stream track then to the default destination. It should not be interrupted until its destination changes.
var context2 = new AudioContext;
// Context who is setting its destination to a media stream track. It should not be interrupted.
var context3 = new AudioContext;
// Context who is created while in the background, its destination as a media stream track then the default destination. It should not be interrupted until its destination changes.
var context4 = new AudioContext;
t.add_cleanup(() => {
context1.close();
context2.close();
context3.close();
context4.close();
});
var source1 = context1.createConstantSource();
source1.connect(context1.destination);
var source2 = context2.createConstantSource();
var destination2 = context2.createMediaStreamDestination();
source2.connect(destination2);
var source3 = context3.createConstantSource();
var destination3 = context3.createMediaStreamDestination();
source3.connect(destination3);
let stateChangePromise = new Promise((resolve, reject) => {
context1.onstatechange = resolve;
setTimeout(() => reject("start promise timed out"), 5000);
});
source1.start();
source2.start();
source3.start();
await stateChangePromise;
await new Promise(resolve => setTimeout(resolve, 10));
assert_equals(context1.state, "running", "test1a");
assert_equals(context2.state, "running", "test1b");
assert_equals(context3.state, "running", "test1c");
stateChangePromise = new Promise((resolve, reject) => {
context1.onstatechange = resolve;
setTimeout(() => reject("context1 interruption promise timed out"), 5000);
})
internals.applicationDidEnterBackground(false);
await stateChangePromise;
await new Promise(resolve => setTimeout(resolve, 10));
assert_equals(context1.state, "interrupted", "test2a");
assert_equals(context2.state, "running", "test2b");
assert_equals(context3.state, "running", "test2c");
var source4 = context4.createConstantSource();
var destination4 = context4.createMediaStreamDestination();
source4.connect(destination4);
stateChangePromise = new Promise((resolve, reject) => {
context2.onstatechange = resolve;
setTimeout(() => reject("context2 interruption promise timed out"), 5000);
});
source2.connect(context2.destination);
await stateChangePromise;
await new Promise(resolve => setTimeout(resolve, 10));
assert_equals(context1.state, "interrupted", "test3a");
assert_equals(context2.state, "interrupted", "test3b");
assert_equals(context3.state, "running", "test3c");
assert_equals(context4.state, "running", "test3d");
stateChangePromise = new Promise((resolve, reject) => {
context4.onstatechange = resolve;
setTimeout(() => reject("context4 interruption promise timed out"), 5000);
});
source4.connect(context4.destination);
await stateChangePromise;
await new Promise(resolve => setTimeout(resolve, 10));
assert_equals(context1.state, "interrupted", "test4q");
assert_equals(context2.state, "interrupted", "test4b");
assert_equals(context3.state, "running", "test4c");
assert_equals(context4.state, "interrupted", "test4d");
stateChangePromise = new Promise((resolve, reject) => {
context2.onstatechange = resolve;
setTimeout(() => reject("context2 uninterruption promise timed out"), 5000);
});
internals.applicationWillEnterForeground(false);
await stateChangePromise;
await new Promise(resolve => setTimeout(resolve, 10));
assert_equals(context1.state, "running", "test5a");
assert_equals(context2.state, "running", "test5b");
assert_equals(context3.state, "running", "test5c");
assert_equals(context4.state, "running", "test5d");
}, "Tests that media session interruption does not cause AudioContext interruption for AudioContext that do not output audio");
</script>
</html>