<!DOCTYPE html> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/speculation-rules/prerender/resources/utils.js"></script> <script src="/speculation-rules/prerender/resources/deferred-promise-utils.js"></script> <script src="webspeech.js"></script> <script> const params = new URLSearchParams(location.search); // The main test page (restriction-speech-synthesis.https.html) loads the // initiator page, then the initiator page will prerender itself with the // `prerendering` parameter. const isPrerendering = params.has('prerendering'); if (!isPrerendering) { loadInitiatorPage(); } else { const method = params.get('method'); const prerenderEventCollector = new PrerenderEventCollector(); const promise = new Promise((resolve, reject) => { switch(method) { case 'speak': { const utter = new SpeechSynthesisUtterance('1'); // https://wicg.github.io/speech-api/#tts-methods // This tests that speak() is completed after prerendering activation. utter.onend = () => { resolve(); } speechSynthesis.speak(utter); break; } case 'cancel': { const utter = new SpeechSynthesisUtterance('1'); // https://wicg.github.io/speech-api/#speechsynthesiserrorevent-attributes // A cancel method call causes 'canceled' or 'interrupted'. // This tests if one of them happens after prerendering activation. utter.onerror = (e) => { if (e.error == 'canceled' || e.error == 'interrupted') resolve(); } speechSynthesis.speak(utter); speechSynthesis.cancel(); break; } case 'pause': { const utter = new SpeechSynthesisUtterance('1'); utter.onpause = () => { resolve(); } speechSynthesis.speak(utter); speechSynthesis.pause(); // To reset the current status for the next test, it calls cancel(). speechSynthesis.cancel(); break; } case 'resume': { const utter = new SpeechSynthesisUtterance('1'); utter.onresume = () => { resolve(); } speechSynthesis.speak(utter); speechSynthesis.pause(); speechSynthesis.resume(); break; } } }); prerenderEventCollector.start(promise, `speechSynthesis.${method}`); } </script>