diff options
Diffstat (limited to 'toolkit/components/narrate/test/browser_narrate.js')
-rw-r--r-- | toolkit/components/narrate/test/browser_narrate.js | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/toolkit/components/narrate/test/browser_narrate.js b/toolkit/components/narrate/test/browser_narrate.js new file mode 100644 index 0000000000..df76743d2f --- /dev/null +++ b/toolkit/components/narrate/test/browser_narrate.js @@ -0,0 +1,146 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +registerCleanupFunction(teardown); + +add_task(async function testNarrate() { + setup(); + + await spawnInNewReaderTab(TEST_ARTICLE, async function () { + let TEST_VOICE = "urn:moz-tts:fake:teresa"; + let $ = content.document.querySelector.bind(content.document); + + await NarrateTestUtils.waitForNarrateToggle(content); + + let popup = $(NarrateTestUtils.POPUP); + ok(!NarrateTestUtils.isVisible(popup), "popup is initially hidden"); + + let toggle = $(NarrateTestUtils.TOGGLE); + toggle.click(); + + ok(NarrateTestUtils.isVisible(popup), "popup toggled"); + + let voiceOptions = $(NarrateTestUtils.VOICE_OPTIONS); + ok( + !NarrateTestUtils.isVisible(voiceOptions), + "voice options are initially hidden" + ); + + $(NarrateTestUtils.VOICE_SELECT).click(); + ok(NarrateTestUtils.isVisible(voiceOptions), "voice options pop up"); + + let prefChanged = NarrateTestUtils.waitForPrefChange("narrate.voice"); + ok( + NarrateTestUtils.selectVoice(content, TEST_VOICE), + "test voice selected" + ); + await prefChanged; + + ok(!NarrateTestUtils.isVisible(voiceOptions), "voice options hidden again"); + + NarrateTestUtils.isStoppedState(content, ok); + + let promiseEvent = ContentTaskUtils.waitForEvent(content, "paragraphstart"); + $(NarrateTestUtils.START).click(); + let speechinfo = (await promiseEvent).detail; + is(speechinfo.voice, TEST_VOICE, "correct voice is being used"); + let paragraph = speechinfo.paragraph; + + NarrateTestUtils.isStartedState(content, ok); + + promiseEvent = ContentTaskUtils.waitForEvent(content, "paragraphstart"); + $(NarrateTestUtils.FORWARD).click(); + speechinfo = (await promiseEvent).detail; + is(speechinfo.voice, TEST_VOICE, "same voice is used"); + isnot(speechinfo.paragraph, paragraph, "next paragraph is being spoken"); + + NarrateTestUtils.isStartedState(content, ok); + + promiseEvent = ContentTaskUtils.waitForEvent(content, "paragraphstart"); + $(NarrateTestUtils.BACK).click(); + speechinfo = (await promiseEvent).detail; + is(speechinfo.paragraph, paragraph, "first paragraph being spoken"); + + NarrateTestUtils.isStartedState(content, ok); + + paragraph = speechinfo.paragraph; + $(NarrateTestUtils.STOP).click(); + await ContentTaskUtils.waitForCondition( + () => !$(NarrateTestUtils.STOP), + "transitioned to stopped state" + ); + NarrateTestUtils.isStoppedState(content, ok); + + promiseEvent = ContentTaskUtils.waitForEvent(content, "paragraphstart"); + $(NarrateTestUtils.START).click(); + speechinfo = (await promiseEvent).detail; + is(speechinfo.paragraph, paragraph, "read same paragraph again"); + + NarrateTestUtils.isStartedState(content, ok); + + let eventUtils = NarrateTestUtils.getEventUtils(content); + + promiseEvent = ContentTaskUtils.waitForEvent(content, "paragraphstart"); + prefChanged = NarrateTestUtils.waitForPrefChange("narrate.rate"); + $(NarrateTestUtils.RATE).focus(); + eventUtils.sendKey("UP", content); + let newspeechinfo = (await promiseEvent).detail; + is(newspeechinfo.paragraph, speechinfo.paragraph, "same paragraph"); + isnot(newspeechinfo.rate, speechinfo.rate, "rate changed"); + await prefChanged; + + promiseEvent = ContentTaskUtils.waitForEvent(content, "paragraphend"); + $(NarrateTestUtils.STOP).click(); + await promiseEvent; + + await ContentTaskUtils.waitForCondition( + () => !$(NarrateTestUtils.STOP), + "transitioned to stopped state" + ); + NarrateTestUtils.isStoppedState(content, ok); + + promiseEvent = ContentTaskUtils.waitForEvent(content, "scroll"); + content.scrollBy(0, 10); + await promiseEvent; + ok(!NarrateTestUtils.isVisible(popup), "popup is hidden after scroll"); + + toggle.click(); + ok(NarrateTestUtils.isVisible(popup), "popup is toggled again"); + + promiseEvent = ContentTaskUtils.waitForEvent(content, "paragraphstart"); + $(NarrateTestUtils.START).click(); + await promiseEvent; + NarrateTestUtils.isStartedState(content, ok); + + promiseEvent = ContentTaskUtils.waitForEvent(content, "scroll"); + content.scrollBy(0, -10); + await promiseEvent; + ok(NarrateTestUtils.isVisible(popup), "popup stays visible after scroll"); + + toggle.click(); + ok(!NarrateTestUtils.isVisible(popup), "popup is dismissed while speaking"); + NarrateTestUtils.isStartedState(content, ok); + + // Go forward all the way to the end of the article. We should eventually + // stop. + do { + promiseEvent = Promise.race([ + ContentTaskUtils.waitForEvent(content, "paragraphstart"), + ContentTaskUtils.waitForEvent(content, "paragraphsdone"), + ]); + $(NarrateTestUtils.FORWARD).click(); + } while ((await promiseEvent).type == "paragraphstart"); + + // This is to make sure we are not actively scrolling when the tab closes. + content.scroll(0, 0); + + await ContentTaskUtils.waitForCondition( + () => !$(NarrateTestUtils.STOP), + "transitioned to stopped state" + ); + NarrateTestUtils.isStoppedState(content, ok); + }); +}); |