<!DOCTYPE html>
<html>
<head>
<title>
Test if starting source node does not resume an explicitly suspended
context
</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../resources/audit.js"></script>
</head>
<body>
<script id="layout-test-code">
const audit = Audit.createTaskRunner();
const autoplayFlag = internals.settings.autoplayIgnoresWebAudioEnabled;
internals.settings.setAutoplayPolicy('document-user-activation-required');
internals.settings.autoplayIgnoresWebAudioEnabled = false;
// Suspend a context explicitly and then start a source node after
// user gesture. The context state should stay the same.
audit.define({label: 'suspend-and-start'}, async (task, should) => {
const context = new AudioContext();
const source = new OscillatorNode(context);
source.connect(context.destination);
await context.suspend();
should(context.state, 'The context state after explicit suspension')
.beEqualTo('suspended');
// Starting a source node should not unlock an explicitly suspended
// context, even if the event is originated from user gesture.
await emulateUserGesture();
source.start();
should(context.state,
'The context state after user gesture followed by source start')
.beEqualTo('suspended');
task.done();
});
audit.define({label: 'clean-up'}, (task, should) => {
internals.runtimeFlags.autoplayIgnoresWebAudioEnabled = autoplayFlag;
internals.settings.setAutoplayPolicy('no-user-gesture-required');
task.done();
});
audit.run();
function emulateUserGesture() {
return new Promise((resolve, reject) => {
chrome.gpuBenchmarking.pointerActionSequence([{
source: 'mouse',
actions: [
{ name: 'pointerDown', x: 1, y: 1 },
{ name: 'pointerUp' },
]
}], resolve);
});
}
</script>
</body>
</html>