tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }