common.js (2846B)
1 function synthTestQueue(aTestArgs, aEndFunc) { 2 var utterances = []; 3 for (var i in aTestArgs) { 4 var uargs = aTestArgs[i][0]; 5 var win = uargs.win || window; 6 var u = new win.SpeechSynthesisUtterance(uargs.text); 7 8 if (uargs.args) { 9 for (var attr in uargs.args) { 10 u[attr] = uargs.args[attr]; 11 } 12 } 13 14 function onend_handler(e) { 15 is(e.target, utterances.shift(), "Target matches utterances"); 16 ok(!speechSynthesis.speaking, "speechSynthesis is not speaking."); 17 18 if (utterances.length) { 19 ok(speechSynthesis.pending, "other utterances queued"); 20 } else { 21 ok(!speechSynthesis.pending, "queue is empty, nothing pending."); 22 if (aEndFunc) { 23 aEndFunc(); 24 } 25 } 26 } 27 28 u.addEventListener( 29 "start", 30 (function (expectedUri) { 31 return function (e) { 32 if (expectedUri) { 33 var chosenVoice = SpecialPowers.wrap(e).target.chosenVoiceURI; 34 is(chosenVoice, expectedUri, "Incorrect URI is used"); 35 } 36 }; 37 })(aTestArgs[i][1] ? aTestArgs[i][1].uri : null) 38 ); 39 40 u.addEventListener("end", onend_handler); 41 u.addEventListener("error", onend_handler); 42 43 u.addEventListener( 44 "error", 45 (function (expectedError) { 46 return function onerror_handler(e) { 47 ok( 48 expectedError, 49 "Error in speech utterance '" + e.target.text + "'" 50 ); 51 }; 52 })(aTestArgs[i][1] ? aTestArgs[i][1].err : false) 53 ); 54 55 utterances.push(u); 56 win.speechSynthesis.speak(u); 57 } 58 59 ok(!speechSynthesis.speaking, "speechSynthesis is not speaking yet."); 60 ok(speechSynthesis.pending, "speechSynthesis has an utterance queued."); 61 } 62 63 function loadFrame(frameId) { 64 return new Promise(function (resolve, reject) { 65 var frame = document.getElementById(frameId); 66 frame.addEventListener("load", function (e) { 67 frame.contentWindow.document.title = frameId; 68 resolve(frame); 69 }); 70 frame.src = "about:blank"; 71 }); 72 } 73 74 function waitForVoices(win) { 75 return new Promise(resolve => { 76 function resolver() { 77 if (win.speechSynthesis.getVoices().length) { 78 win.speechSynthesis.removeEventListener("voiceschanged", resolver); 79 resolve(); 80 } 81 } 82 83 win.speechSynthesis.addEventListener("voiceschanged", resolver); 84 resolver(); 85 }); 86 } 87 88 function loadSpeechTest(fileName, prefs, frameId = "testFrame") { 89 loadFrame(frameId).then(frame => { 90 waitForVoices(frame.contentWindow).then( 91 () => (document.getElementById("testFrame").src = fileName) 92 ); 93 }); 94 } 95 96 function testSynthState(win, expectedState) { 97 for (var attr in expectedState) { 98 is( 99 win.speechSynthesis[attr], 100 expectedState[attr], 101 win.document.title + ": '" + attr + '" does not match' 102 ); 103 } 104 }