chromium/chrome/test/data/extensions/api_test/tts_engine/lacros_tts_support/tts_pause_during_speak_lacros_engine/test.js

// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// TTS api test running from Lacros with Ash.
// build/lacros/test_runner.py test
//     {path_to_lacros_build}/lacros_chrome_browsertests
//     --gtest_filter=LacrosTtsApiTest.PauseDuringSpeakWithLacrosTtsEngine
//     --ash-chrome-path {path_to_ash_build}/test_ash_chrome

chrome.test.runTests([
  function testPauseDuringSpeakWithLacrosTtsEngine() {
    let sendTtsEventFunc;
    const utteranceText = "Hello";

    // Register listeners for speech functions, enabling this extension
    // to be a TTS engine.
    let onSpeakPromise = new Promise((resolve) => {
      chrome.ttsEngine.onSpeak.addListener(function listener(
        utterance, options, sendTtsEvent) {
        chrome.test.assertNoLastError();
        sendTtsEventFunc = sendTtsEvent;
        chrome.test.assertEq(utteranceText, utterance);
        sendTtsEvent({
          'type': 'start',
          'charIndex': utterance.length
        });
        chrome.ttsEngine.onSpeak.removeListener(listener);
        resolve();
      });
    });

    let stopListener = function () {};
    chrome.ttsEngine.onStop.addListener(stopListener);

    let onPausePromise = new Promise((resolve) => {
      chrome.ttsEngine.onPause.addListener(function listener() {
        chrome.test.assertNoLastError();
        chrome.ttsEngine.onPause.removeListener(listener);
        resolve();
      })
    });

    let onResumePromise = new Promise((resolve) => {
      chrome.ttsEngine.onResume.addListener(function listener() {
        chrome.test.assertNoLastError();
        // Simulate the speech engine resuming speech synthesis and finish
        // the utterance.
        sendTtsEventFunc({
          'type': 'end',
          'charIndex': utteranceText.length
        });
        chrome.ttsEngine.onResume.removeListener(listener);
        resolve();
      })
    });

    // Call tts.speak to speak an utterance with our own speech engine running
    // in Lacros.
    let ttsSpeakPromise = new Promise((resolve) => {
      let startEventReceived = false;
      chrome.tts.speak(
        utteranceText, {
          'voiceName': 'Alice',
          'onEvent': function (event) {
            if (event.type == 'start') {
              startEventReceived = true;
            } else if (event.type == 'end') {
              chrome.test.assertEq(startEventReceived, true);
              resolve();
            }
          }
        },
        function () {
          chrome.test.assertNoLastError();
        });
    });

    // Request pausing speech synthesis during the Lacros speech engine speaking
    // an utterance. Ash's TtsController will pause speech synthesis and send
    // onPause event to the Lacros speech engine speaking the current utterance.
    chrome.tts.pause();

    // Request resuming speech synthesis. Ash's TtsController will resume speech
    // synthesis and send onResume event to the Lacros speech engine it has
    // paused previously.
    chrome.tts.resume();

    // Verify that all ttsEngine events have been delivered to the speech
    // engine, and tts.speak finishes the utterance.
    Promise.all([onSpeakPromise, onPausePromise, onResumePromise,
      ttsSpeakPromise
    ]).then(() => {
      chrome.ttsEngine.onStop.removeListener(stopListener);
      chrome.test.succeed();
    });
  }
]);