<!doctype html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<body>
<script>
// This test is tentative because timing isn't defined:
// https://github.com/w3c/speech-api/issues/39
// https://github.com/w3c/speech-api/issues/40
async_test(t => {
assert_false(speechSynthesis.paused, 'initial paused state');
test_driver.bless('speechSynthesis.speak', t.step_func(() => {
const sentence = `long sentence which will take at least a few seconds to
utter so that it's possible to pause and resume before the end`;
const utter = new SpeechSynthesisUtterance(sentence);
t.add_cleanup(() => speechSynthesis.pause());
utter.onerror = t.unreached_func('error event');
speechSynthesis.speak(utter);
assert_false(speechSynthesis.paused, 'paused state after speak()');
utter.onstart = t.step_func(() => {
utter.onstart = null;
assert_false(speechSynthesis.paused, 'paused state at start event');
speechSynthesis.pause();
// paused state changes async, right before the pause event
assert_false(speechSynthesis.paused, 'paused state after pause()');
utter.onpause = t.step_func(() => {
utter.onpause = null;
assert_true(speechSynthesis.paused, 'paused state at pause event');
speechSynthesis.resume();
// paused state changes async, right before the resume event
assert_true(speechSynthesis.paused, 'paused state after resume()');
utter.onresume = t.step_func_done(() => {
assert_false(speechSynthesis.paused, 'paused state at resume event');
});
});
});
}));
}, 'speechSynthesis.pause() and resume() state and events');
</script>