summaryrefslogtreecommitdiffstats
path: root/toolkit/components/narrate/test
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/narrate/test')
-rw-r--r--toolkit/components/narrate/test/.eslintrc.js23
-rw-r--r--toolkit/components/narrate/test/NarrateTestUtils.jsm148
-rw-r--r--toolkit/components/narrate/test/browser.ini12
-rw-r--r--toolkit/components/narrate/test/browser_narrate.js137
-rw-r--r--toolkit/components/narrate/test/browser_narrate_disable.js37
-rw-r--r--toolkit/components/narrate/test/browser_narrate_language.js73
-rw-r--r--toolkit/components/narrate/test/browser_voiceselect.js112
-rw-r--r--toolkit/components/narrate/test/browser_word_highlight.js69
-rw-r--r--toolkit/components/narrate/test/head.js87
-rw-r--r--toolkit/components/narrate/test/inferno.html238
-rw-r--r--toolkit/components/narrate/test/moby_dick.html218
11 files changed, 0 insertions, 1154 deletions
diff --git a/toolkit/components/narrate/test/.eslintrc.js b/toolkit/components/narrate/test/.eslintrc.js
deleted file mode 100644
index 5ff0bae7e..000000000
--- a/toolkit/components/narrate/test/.eslintrc.js
+++ /dev/null
@@ -1,23 +0,0 @@
-"use strict";
-
-module.exports = { // eslint-disable-line no-undef
- "extends": [
- "../.eslintrc.js"
- ],
-
- "globals": {
- "is": true,
- "isnot": true,
- "ok": true,
- "NarrateTestUtils": true,
- "content": true,
- "ContentTaskUtils": true,
- "ContentTask": true,
- "BrowserTestUtils": true,
- "gBrowser": true,
- },
-
- "rules": {
- "mozilla/import-headjs-globals": "warn"
- }
-};
diff --git a/toolkit/components/narrate/test/NarrateTestUtils.jsm b/toolkit/components/narrate/test/NarrateTestUtils.jsm
deleted file mode 100644
index b782f66c9..000000000
--- a/toolkit/components/narrate/test/NarrateTestUtils.jsm
+++ /dev/null
@@ -1,148 +0,0 @@
-/* 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";
-
-const Cu = Components.utils;
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/Preferences.jsm");
-Cu.import("resource://testing-common/ContentTaskUtils.jsm");
-
-this.EXPORTED_SYMBOLS = [ "NarrateTestUtils" ];
-
-this.NarrateTestUtils = {
- TOGGLE: "#narrate-toggle",
- POPUP: "#narrate-dropdown .dropdown-popup",
- VOICE_SELECT: "#narrate-voices .select-toggle",
- VOICE_OPTIONS: "#narrate-voices .options",
- VOICE_SELECTED: "#narrate-voices .options .option.selected",
- VOICE_SELECT_LABEL: "#narrate-voices .select-toggle .current-voice",
- RATE: "#narrate-rate-input",
- START: "#narrate-dropdown:not(.speaking) #narrate-start-stop",
- STOP: "#narrate-dropdown.speaking #narrate-start-stop",
- BACK: "#narrate-skip-previous",
- FORWARD: "#narrate-skip-next",
-
- isVisible: function(element) {
- let style = element.ownerDocument.defaultView.getComputedStyle(element, "");
- if (style.display == "none") {
- return false;
- } else if (style.visibility != "visible") {
- return false;
- } else if (style.display == "-moz-popup" && element.state != "open") {
- return false;
- }
-
- // Hiding a parent element will hide all its children
- if (element.parentNode != element.ownerDocument) {
- return this.isVisible(element.parentNode);
- }
-
- return true;
- },
-
- isStoppedState: function(window, ok) {
- let $ = window.document.querySelector.bind(window.document);
- ok($(this.BACK).disabled, "back button is disabled");
- ok($(this.FORWARD).disabled, "forward button is disabled");
- ok(!!$(this.START), "start button is showing");
- ok(!$(this.STOP), "stop button is hidden");
- // This checks for a localized label. Not the best...
- ok($(this.START).title == "Start", "Button tooltip is correct");
- },
-
- isStartedState: function(window, ok) {
- let $ = window.document.querySelector.bind(window.document);
- ok(!$(this.BACK).disabled, "back button is enabled");
- ok(!$(this.FORWARD).disabled, "forward button is enabled");
- ok(!$(this.START), "start button is hidden");
- ok(!!$(this.STOP), "stop button is showing");
- // This checks for a localized label. Not the best...
- ok($(this.STOP).title == "Stop", "Button tooltip is correct");
- },
-
- selectVoice: function(window, voiceUri) {
- if (!this.isVisible(window.document.querySelector(this.VOICE_OPTIONS))) {
- window.document.querySelector(this.VOICE_SELECT).click();
- }
-
- let voiceOption = window.document.querySelector(
- `#narrate-voices .option[data-value="${voiceUri}"]`);
-
- voiceOption.focus();
- voiceOption.click();
-
- return voiceOption.classList.contains("selected");
- },
-
- getEventUtils: function(window) {
- let eventUtils = {
- "_EU_Ci": Components.interfaces,
- "_EU_Cc": Components.classes,
- window: window,
- parent: window,
- navigator: window.navigator,
- KeyboardEvent: window.KeyboardEvent,
- KeyEvent: window.KeyEvent
- };
- Services.scriptloader.loadSubScript(
- "chrome://mochikit/content/tests/SimpleTest/EventUtils.js", eventUtils);
- return eventUtils;
- },
-
- getReaderReadyPromise: function(window) {
- return new Promise(resolve => {
- function observeReady(subject, topic) {
- if (subject == window) {
- Services.obs.removeObserver(observeReady, topic);
- resolve();
- }
- }
-
- if (window.document.body.classList.contains("loaded")) {
- resolve();
- } else {
- Services.obs.addObserver(observeReady, "AboutReader:Ready", false);
- }
- });
- },
-
- waitForNarrateToggle: function(window) {
- let toggle = window.document.querySelector(this.TOGGLE);
- return ContentTaskUtils.waitForCondition(
- () => !toggle.hidden, "");
- },
-
- waitForPrefChange: function(pref) {
- return new Promise(resolve => {
- function observeChange() {
- Services.prefs.removeObserver(pref, observeChange);
- resolve(Preferences.get(pref));
- }
-
- Services.prefs.addObserver(pref, observeChange, false);
- });
- },
-
- sendBoundaryEvent: function(window, name, charIndex) {
- let detail = { type: "boundary", args: { name, charIndex } };
- window.dispatchEvent(new window.CustomEvent("testsynthevent",
- { detail: detail }));
- },
-
- isWordHighlightGone: function(window, ok) {
- let $ = window.document.querySelector.bind(window.document);
- ok(!$(".narrate-word-highlight"), "No more word highlights exist");
- },
-
- getWordHighlights: function(window) {
- let $$ = window.document.querySelectorAll.bind(window.document);
- let nodes = Array.from($$(".narrate-word-highlight"));
- return nodes.map(node => {
- return { word: node.dataset.word,
- left: Number(node.style.left.replace(/px$/, "")),
- top: Number(node.style.top.replace(/px$/, ""))};
- });
- }
-};
diff --git a/toolkit/components/narrate/test/browser.ini b/toolkit/components/narrate/test/browser.ini
deleted file mode 100644
index 0f5d694ac..000000000
--- a/toolkit/components/narrate/test/browser.ini
+++ /dev/null
@@ -1,12 +0,0 @@
-[DEFAULT]
-support-files =
- head.js
- NarrateTestUtils.jsm
- moby_dick.html
-
-[browser_narrate.js]
-[browser_narrate_disable.js]
-[browser_narrate_language.js]
-support-files = inferno.html
-[browser_voiceselect.js]
-[browser_word_highlight.js]
diff --git a/toolkit/components/narrate/test/browser_narrate.js b/toolkit/components/narrate/test/browser_narrate.js
deleted file mode 100644
index b4951ef9f..000000000
--- a/toolkit/components/narrate/test/browser_narrate.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/* 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/. */
-
-/* globals is, isnot, registerCleanupFunction, add_task */
-
-"use strict";
-
-registerCleanupFunction(teardown);
-
-add_task(function* testNarrate() {
- setup();
-
- yield spawnInNewReaderTab(TEST_ARTICLE, function* () {
- let TEST_VOICE = "urn:moz-tts:fake-indirect:teresa";
- let $ = content.document.querySelector.bind(content.document);
-
- yield 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");
- yield prefChanged;
-
- ok(!NarrateTestUtils.isVisible(voiceOptions), "voice options hidden again");
-
- NarrateTestUtils.isStoppedState(content, ok);
-
- let promiseEvent = ContentTaskUtils.waitForEvent(content, "paragraphstart");
- $(NarrateTestUtils.START).click();
- let speechinfo = (yield 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 = (yield 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 = (yield promiseEvent).detail;
- is(speechinfo.paragraph, paragraph, "first paragraph being spoken");
-
- NarrateTestUtils.isStartedState(content, ok);
-
- paragraph = speechinfo.paragraph;
- $(NarrateTestUtils.STOP).click();
- yield ContentTaskUtils.waitForCondition(
- () => !$(NarrateTestUtils.STOP), "transitioned to stopped state");
- NarrateTestUtils.isStoppedState(content, ok);
-
- promiseEvent = ContentTaskUtils.waitForEvent(content, "paragraphstart");
- $(NarrateTestUtils.START).click();
- speechinfo = (yield 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 = (yield promiseEvent).detail;
- is(newspeechinfo.paragraph, speechinfo.paragraph, "same paragraph");
- isnot(newspeechinfo.rate, speechinfo.rate, "rate changed");
- yield prefChanged;
-
- promiseEvent = ContentTaskUtils.waitForEvent(content, "paragraphend");
- $(NarrateTestUtils.STOP).click();
- yield promiseEvent;
-
- yield ContentTaskUtils.waitForCondition(
- () => !$(NarrateTestUtils.STOP), "transitioned to stopped state");
- NarrateTestUtils.isStoppedState(content, ok);
-
- promiseEvent = ContentTaskUtils.waitForEvent(content, "scroll");
- content.scrollBy(0, 10);
- yield 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();
- yield promiseEvent;
- NarrateTestUtils.isStartedState(content, ok);
-
- promiseEvent = ContentTaskUtils.waitForEvent(content, "scroll");
- content.scrollBy(0, -10);
- yield 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 ((yield promiseEvent).type == "paragraphstart");
-
- // This is to make sure we are not actively scrolling when the tab closes.
- content.scroll(0, 0);
-
- yield ContentTaskUtils.waitForCondition(
- () => !$(NarrateTestUtils.STOP), "transitioned to stopped state");
- NarrateTestUtils.isStoppedState(content, ok);
- });
-});
diff --git a/toolkit/components/narrate/test/browser_narrate_disable.js b/toolkit/components/narrate/test/browser_narrate_disable.js
deleted file mode 100644
index 264815fd1..000000000
--- a/toolkit/components/narrate/test/browser_narrate_disable.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/* 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/. */
-
-/* globals registerCleanupFunction, add_task */
-
-"use strict";
-
-const ENABLE_PREF = "narrate.enabled";
-
-registerCleanupFunction(() => {
- clearUserPref(ENABLE_PREF);
- teardown();
-});
-
-add_task(function* testNarratePref() {
- setup();
-
- yield spawnInNewReaderTab(TEST_ARTICLE, function() {
- is(content.document.querySelectorAll(NarrateTestUtils.TOGGLE).length, 1,
- "narrate is inserted by default");
- });
-
- setBoolPref(ENABLE_PREF, false);
-
- yield spawnInNewReaderTab(TEST_ARTICLE, function() {
- ok(!content.document.querySelector(NarrateTestUtils.TOGGLE),
- "narrate is disabled and is not in reader mode");
- });
-
- setBoolPref(ENABLE_PREF, true);
-
- yield spawnInNewReaderTab(TEST_ARTICLE, function() {
- is(content.document.querySelectorAll(NarrateTestUtils.TOGGLE).length, 1,
- "narrate is re-enabled and appears only once");
- });
-});
diff --git a/toolkit/components/narrate/test/browser_narrate_language.js b/toolkit/components/narrate/test/browser_narrate_language.js
deleted file mode 100644
index 2542a87d6..000000000
--- a/toolkit/components/narrate/test/browser_narrate_language.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/* 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/. */
-
-/* globals is, isnot, registerCleanupFunction, add_task */
-
-"use strict";
-
-registerCleanupFunction(teardown);
-
-add_task(function* testVoiceselectDropdownAutoclose() {
- setup("automatic", true);
-
- yield spawnInNewReaderTab(TEST_ARTICLE, function* () {
- let $ = content.document.querySelector.bind(content.document);
-
- yield NarrateTestUtils.waitForNarrateToggle(content);
-
- ok(!!$(".option[data-value='urn:moz-tts:fake-direct:bob']"),
- "Jamaican English voice available");
- ok(!!$(".option[data-value='urn:moz-tts:fake-direct:lenny']"),
- "Canadian English voice available");
- ok(!!$(".option[data-value='urn:moz-tts:fake-direct:amy']"),
- "British English voice available");
-
- ok(!$(".option[data-value='urn:moz-tts:fake-direct:celine']"),
- "Canadian French voice unavailable");
- ok(!$(".option[data-value='urn:moz-tts:fake-direct:julie']"),
- "Mexican Spanish voice unavailable");
-
- $(NarrateTestUtils.TOGGLE).click();
- ok(NarrateTestUtils.isVisible($(NarrateTestUtils.POPUP)),
- "popup is toggled");
-
- let prefChanged = NarrateTestUtils.waitForPrefChange(
- "narrate.voice", "getCharPref");
- NarrateTestUtils.selectVoice(content, "urn:moz-tts:fake-direct:lenny");
- let voicePref = JSON.parse(yield prefChanged);
- is(voicePref.en, "urn:moz-tts:fake-direct:lenny", "pref set correctly");
- });
-});
-
-add_task(function* testVoiceselectDropdownAutoclose() {
- setup("automatic", true);
-
- yield spawnInNewReaderTab(TEST_ITALIAN_ARTICLE, function* () {
- let $ = content.document.querySelector.bind(content.document);
-
- yield NarrateTestUtils.waitForNarrateToggle(content);
-
- ok(!!$(".option[data-value='urn:moz-tts:fake-indirect:zanetta']"),
- "Italian voice available");
- ok(!!$(".option[data-value='urn:moz-tts:fake-indirect:margherita']"),
- "Italian voice available");
-
- ok(!$(".option[data-value='urn:moz-tts:fake-direct:bob']"),
- "Jamaican English voice available");
- ok(!$(".option[data-value='urn:moz-tts:fake-direct:celine']"),
- "Canadian French voice unavailable");
- ok(!$(".option[data-value='urn:moz-tts:fake-direct:julie']"),
- "Mexican Spanish voice unavailable");
-
- $(NarrateTestUtils.TOGGLE).click();
- ok(NarrateTestUtils.isVisible($(NarrateTestUtils.POPUP)),
- "popup is toggled");
-
- let prefChanged = NarrateTestUtils.waitForPrefChange(
- "narrate.voice", "getCharPref");
- NarrateTestUtils.selectVoice(content, "urn:moz-tts:fake-indirect:zanetta");
- let voicePref = JSON.parse(yield prefChanged);
- is(voicePref.it, "urn:moz-tts:fake-indirect:zanetta", "pref set correctly");
- });
-});
diff --git a/toolkit/components/narrate/test/browser_voiceselect.js b/toolkit/components/narrate/test/browser_voiceselect.js
deleted file mode 100644
index 0de6528dd..000000000
--- a/toolkit/components/narrate/test/browser_voiceselect.js
+++ /dev/null
@@ -1,112 +0,0 @@
-/* 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/. */
-
-/* globals registerCleanupFunction, add_task, is, isnot */
-
-"use strict";
-
-registerCleanupFunction(teardown);
-
-add_task(function* testVoiceselectDropdownAutoclose() {
- setup();
-
- yield spawnInNewReaderTab(TEST_ARTICLE, function* () {
- let $ = content.document.querySelector.bind(content.document);
-
- yield NarrateTestUtils.waitForNarrateToggle(content);
-
- $(NarrateTestUtils.TOGGLE).click();
- ok(NarrateTestUtils.isVisible($(NarrateTestUtils.POPUP)),
- "popup is toggled");
-
- ok(!NarrateTestUtils.isVisible($(NarrateTestUtils.VOICE_OPTIONS)),
- "voice options are initially hidden");
-
- $(NarrateTestUtils.VOICE_SELECT).click();
- ok(NarrateTestUtils.isVisible($(NarrateTestUtils.VOICE_OPTIONS)),
- "voice options are toggled");
-
- $(NarrateTestUtils.TOGGLE).click();
- // A focus will follow a real click.
- $(NarrateTestUtils.TOGGLE).focus();
- ok(!NarrateTestUtils.isVisible($(NarrateTestUtils.POPUP)),
- "narrate popup is dismissed");
-
- $(NarrateTestUtils.TOGGLE).click();
- // A focus will follow a real click.
- $(NarrateTestUtils.TOGGLE).focus();
- ok(NarrateTestUtils.isVisible($(NarrateTestUtils.POPUP)),
- "narrate popup is showing again");
- ok(!NarrateTestUtils.isVisible($(NarrateTestUtils.VOICE_OPTIONS)),
- "voice options are hidden after popup comes back");
- });
-});
-
-add_task(function* testVoiceselectLabelChange() {
- setup();
-
- yield spawnInNewReaderTab(TEST_ARTICLE, function* () {
- let $ = content.document.querySelector.bind(content.document);
-
- yield NarrateTestUtils.waitForNarrateToggle(content);
-
- $(NarrateTestUtils.TOGGLE).click();
- ok(NarrateTestUtils.isVisible($(NarrateTestUtils.POPUP)),
- "popup is toggled");
-
- ok(NarrateTestUtils.selectVoice(content, "urn:moz-tts:fake-direct:lenny"),
- "voice selected");
-
- let selectedOption = $(NarrateTestUtils.VOICE_SELECTED);
- let selectLabel = $(NarrateTestUtils.VOICE_SELECT_LABEL);
-
- is(selectedOption.textContent, selectLabel.textContent,
- "new label matches selected voice");
- });
-});
-
-add_task(function* testVoiceselectKeyboard() {
- setup();
-
- yield spawnInNewReaderTab(TEST_ARTICLE, function* () {
- let $ = content.document.querySelector.bind(content.document);
-
- yield NarrateTestUtils.waitForNarrateToggle(content);
-
- $(NarrateTestUtils.TOGGLE).click();
- ok(NarrateTestUtils.isVisible($(NarrateTestUtils.POPUP)),
- "popup is toggled");
-
- let eventUtils = NarrateTestUtils.getEventUtils(content);
-
- let firstValue = $(NarrateTestUtils.VOICE_SELECTED).dataset.value;
-
- ok(!NarrateTestUtils.isVisible($(NarrateTestUtils.VOICE_OPTIONS)),
- "voice options initially are hidden");
-
- $(NarrateTestUtils.VOICE_SELECT).focus();
-
- eventUtils.sendKey("DOWN", content);
-
- yield ContentTaskUtils.waitForCondition(
- () => $(NarrateTestUtils.VOICE_SELECTED).dataset.value != firstValue,
- "value changed after pressing DOWN key");
-
- eventUtils.sendKey("RETURN", content);
-
- ok(NarrateTestUtils.isVisible($(NarrateTestUtils.VOICE_OPTIONS)),
- "voice options showing after pressing RETURN");
-
- eventUtils.sendKey("UP", content);
-
- eventUtils.sendKey("RETURN", content);
-
- ok(!NarrateTestUtils.isVisible($(NarrateTestUtils.VOICE_OPTIONS)),
- "voice options hidden after pressing RETURN");
-
- yield ContentTaskUtils.waitForCondition(
- () => $(NarrateTestUtils.VOICE_SELECTED).dataset.value == firstValue,
- "value changed back to original after pressing RETURN");
- });
-});
diff --git a/toolkit/components/narrate/test/browser_word_highlight.js b/toolkit/components/narrate/test/browser_word_highlight.js
deleted file mode 100644
index bfdbcf48e..000000000
--- a/toolkit/components/narrate/test/browser_word_highlight.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/* 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/. */
-
-/* globals is, isnot, registerCleanupFunction, add_task */
-
-"use strict";
-
-registerCleanupFunction(teardown);
-
-add_task(function* testNarrate() {
- setup("urn:moz-tts:fake-indirect:teresa");
-
- yield spawnInNewReaderTab(TEST_ARTICLE, function* () {
- let $ = content.document.querySelector.bind(content.document);
-
- yield 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");
-
- NarrateTestUtils.isStoppedState(content, ok);
-
- let promiseEvent = ContentTaskUtils.waitForEvent(content, "paragraphstart");
- $(NarrateTestUtils.START).click();
- let voice = (yield promiseEvent).detail.voice;
- is(voice, "urn:moz-tts:fake-indirect:teresa", "double-check voice");
-
- // Skip forward to first paragraph.
- let details;
- do {
- promiseEvent = ContentTaskUtils.waitForEvent(content, "paragraphstart");
- $(NarrateTestUtils.FORWARD).click();
- details = (yield promiseEvent).detail;
- } while (details.tag != "p");
-
- let boundaryPat = /(\s+)\S/g;
- let position = { left: 0, top: 0 };
- let text = details.paragraph;
- for (let res = boundaryPat.exec(text); res; res = boundaryPat.exec(text)) {
- promiseEvent = ContentTaskUtils.waitForEvent(content, "wordhighlight");
- NarrateTestUtils.sendBoundaryEvent(content, "word", res.index);
- let { start, end } = (yield promiseEvent).detail;
- let nodes = NarrateTestUtils.getWordHighlights(content);
- for (let node of nodes) {
- // Since this is English we can assume each word is to the right or
- // below the previous one.
- ok(node.left > position.left || node.top > position.top,
- "highlight position is moving");
- position = { left: node.left, top: node.top };
- }
- let wordFromOffset = text.substring(start, end);
- // XXX: Each node should contain the part of the word it highlights.
- // Right now, each node contains the entire word.
- let wordFromHighlight = nodes[0].word;
- is(wordFromOffset, wordFromHighlight, "Correct word is highlighted");
- }
-
- $(NarrateTestUtils.STOP).click();
- yield ContentTaskUtils.waitForCondition(
- () => !$(NarrateTestUtils.STOP), "transitioned to stopped state");
- NarrateTestUtils.isWordHighlightGone(content, ok);
- });
-});
diff --git a/toolkit/components/narrate/test/head.js b/toolkit/components/narrate/test/head.js
deleted file mode 100644
index 491a3da8d..000000000
--- a/toolkit/components/narrate/test/head.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/* 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/. */
-
-/* exported teardown, setup, toggleExtension,
- spawnInNewReaderTab, TEST_ARTICLE, TEST_ITALIAN_ARTICLE */
-
-"use strict";
-
-const TEST_ARTICLE =
- "http://example.com/browser/toolkit/components/narrate/test/moby_dick.html";
-
-const TEST_ITALIAN_ARTICLE =
- "http://example.com/browser/toolkit/components/narrate/test/inferno.html";
-
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "Promise",
- "resource://gre/modules/Promise.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "Services",
- "resource://gre/modules/Services.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "AddonManager",
- "resource://gre/modules/AddonManager.jsm");
-
-const TEST_PREFS = {
- "reader.parse-on-load.enabled": true,
- "media.webspeech.synth.enabled": true,
- "media.webspeech.synth.test": true,
- "narrate.enabled": true,
- "narrate.test": true,
- "narrate.voice": null,
- "narrate.filter-voices": false,
-};
-
-function setup(voiceUri = "automatic", filterVoices = false) {
- let prefs = Object.assign({}, TEST_PREFS, {
- "narrate.filter-voices": filterVoices,
- "narrate.voice": JSON.stringify({ en: voiceUri })
- });
-
- // Set required test prefs.
- Object.entries(prefs).forEach(([name, value]) => {
- switch (typeof value) {
- case "boolean":
- setBoolPref(name, value);
- break;
- case "string":
- setCharPref(name, value);
- break;
- }
- });
-}
-
-function teardown() {
- // Reset test prefs.
- Object.entries(TEST_PREFS).forEach(pref => {
- clearUserPref(pref[0]);
- });
-}
-
-function spawnInNewReaderTab(url, func) {
- return BrowserTestUtils.withNewTab(
- { gBrowser,
- url: `about:reader?url=${encodeURIComponent(url)}` },
- function* (browser) {
- yield ContentTask.spawn(browser, null, function* () {
- Components.utils.import("chrome://mochitests/content/browser/" +
- "toolkit/components/narrate/test/NarrateTestUtils.jsm");
-
- yield NarrateTestUtils.getReaderReadyPromise(content);
- });
-
- yield ContentTask.spawn(browser, null, func);
- });
-}
-
-function setBoolPref(name, value) {
- Services.prefs.setBoolPref(name, value);
-}
-
-function setCharPref(name, value) {
- Services.prefs.setCharPref(name, value);
-}
-
-function clearUserPref(name) {
- Services.prefs.clearUserPref(name);
-}
diff --git a/toolkit/components/narrate/test/inferno.html b/toolkit/components/narrate/test/inferno.html
deleted file mode 100644
index 58dfd24df..000000000
--- a/toolkit/components/narrate/test/inferno.html
+++ /dev/null
@@ -1,238 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Inferno - Canto I</title>
-</head>
-<body>
- <h1>Inferno</h1>
- <h2>Canto I: Dante nella selva oscura</h2>
- <p>
- Nel mezzo del cammin di nostra vita<br>
- mi ritrovai per una selva oscura,<br>
- ché la diritta via era smarrita.
- </p>
- <p>
- Ahi quanto a dir qual era è cosa dura<br>
- esta selva selvaggia e aspra e forte<br>
- che nel pensier rinova la paura!
- </p>
- <p>
- Tant' è amara che poco è più morte;<br>
- ma per trattar del ben ch'i' vi trovai,<br>
- dirò de l'altre cose ch'i' v'ho scorte.
- </p>
- <p>
- Io non so ben ridir com' i' v'intrai,<br>
- tant' era pien di sonno a quel punto<br>
- che la verace via abbandonai.
- </p>
- <p>
- Ma poi ch'i' fui al piè d'un colle giunto,<br>
- là dove terminava quella valle<br>
- che m'avea di paura il cor compunto,
- </p>
- <p>
- guardai in alto e vidi le sue spalle<br>
- vestite già de' raggi del pianeta<br>
- che mena dritto altrui per ogne calle.
- </p>
- <p>
- Allor fu la paura un poco queta,<br>
- che nel lago del cor m'era durata<br>
- la notte ch'i' passai con tanta pieta.
- </p>
- <p>
- E come quei che con lena affannata,<br>
- uscito fuor del pelago a la riva,<br>
- si volge a l'acqua perigliosa e guata,
- </p>
- <p>
- così l'animo mio, ch'ancor fuggiva,<br>
- si volse a retro a rimirar lo passo<br>
- che non lasciò già mai persona viva.
- </p>
- <p>
- Poi ch'èi posato un poco il corpo lasso,<br>
- ripresi via per la piaggia diserta,<br>
- sì che 'l piè fermo sempre era 'l più basso.
- </p>
- <p>
- Ed ecco, quasi al cominciar de l'erta,<br>
- una lonza leggiera e presta molto,<br>
- che di pel macolato era coverta;
- </p>
- <p>
- e non mi si partia dinanzi al volto,<br>
- anzi 'mpediva tanto il mio cammino,<br>
- ch'i' fui per ritornar più volte vòlto.
- </p>
- <p>
- Temp' era dal principio del mattino,<br>
- e 'l sol montava 'n sù con quelle stelle<br>
- ch'eran con lui quando l'amor divino
- </p>
- <p>
- mosse di prima quelle cose belle;<br>
- sì ch'a bene sperar m'era cagione<br>
- di quella fiera a la gaetta pelle
- </p>
- <p>
- l'ora del tempo e la dolce stagione;<br>
- ma non sì che paura non mi desse<br>
- la vista che m'apparve d'un leone.
- </p>
- <p>
- Questi parea che contra me venisse<br>
- con la test' alta e con rabbiosa fame,<br>
- sì che parea che l'aere ne tremesse.
- </p>
- <p>
- Ed una lupa, che di tutte brame<br>
- sembiava carca ne la sua magrezza,<br>
- e molte genti fé già viver grame,
- </p>
- <p>
- questa mi porse tanto di gravezza<br>
- con la paura ch'uscia di sua vista,<br>
- ch'io perdei la speranza de l'altezza.
- </p>
- <p>
- E qual è quei che volontieri acquista,<br>
- e giugne 'l tempo che perder lo face,<br>
- che 'n tutti suoi pensier piange e s'attrista;
- </p>
- <p>
- tal mi fece la bestia sanza pace,<br>
- che, venendomi 'ncontro, a poco a poco<br>
- mi ripigneva là dove 'l sol tace.
- </p>
- <p>
- Mentre ch'i' rovinava in basso loco,<br>
- dinanzi a li occhi mi si fu offerto<br>
- chi per lungo silenzio parea fioco.
- </p>
- <p>
- Quando vidi costui nel gran diserto,<br>
- «<em>Miserere</em> di me», gridai a lui,<br>
- «qual che tu sii, od ombra od omo certo!».
- </p>
- <p>
- Rispuosemi: «Non omo, omo già fui,<br>
- e li parenti miei furon lombardi,<br>
- mantoani per patrïa ambedui.
- </p>
- <p>
- Nacqui <em>sub Iulio</em>, ancor che fosse tardi,<br>
- e vissi a Roma sotto 'l buono Augusto<br>
- nel tempo de li dèi falsi e bugiardi.
- </p>
- <p>
- Poeta fui, e cantai di quel giusto<br>
- figliuol d'Anchise che venne di Troia,<br>
- poi che 'l superbo Ilïón fu combusto.
- </p>
- <p>
- Ma tu perché ritorni a tanta noia?<br>
- perché non sali il dilettoso monte<br>
- ch'è principio e cagion di tutta gioia?».
- </p>
- <p>
- «Or se' tu quel Virgilio e quella fonte<br>
- che spandi di parlar sì largo fiume?»,<br>
- rispuos' io lui con vergognosa fronte.
- </p>
- <p>
- «O de li altri poeti onore e lume,<br>
- vagliami 'l lungo studio e 'l grande amore<br>
- che m'ha fatto cercar lo tuo volume.
- </p>
- <p>
- Tu se' lo mio maestro e 'l mio autore,<br>
- tu se' solo colui da cu' io tolsi<br>
- lo bello stilo che m'ha fatto onore.
- </p>
- <p>
- Vedi la bestia per cu' io mi volsi;<br>
- aiutami da lei, famoso saggio,<br>
- ch'ella mi fa tremar le vene e i polsi».
- </p>
- <p>
- «A te convien tenere altro vïaggio»,<br>
- rispuose, poi che lagrimar mi vide,<br>
- «se vuo' campar d'esto loco selvaggio;
- </p>
- <p>
- ché questa bestia, per la qual tu gride,<br>
- non lascia altrui passar per la sua via,<br>
- ma tanto lo 'mpedisce che l'uccide;
- </p>
- <p>
- e ha natura sì malvagia e ria,<br>
- che mai non empie la bramosa voglia,<br>
- e dopo 'l pasto ha più fame che pria.
- </p>
- <p>
- Molti son li animali a cui s'ammoglia,<br>
- e più saranno ancora, infin che 'l veltro<br>
- verrà, che la farà morir con doglia.
- </p>
- <p>
- Questi non ciberà terra né peltro,<br>
- ma sapïenza, amore e virtute,<br>
- e sua nazion sarà tra feltro e feltro.
- </p>
- <p>
- Di quella umile Italia fia salute<br>
- per cui morì la vergine Cammilla,<br>
- Eurialo e Turno e Niso di ferute.
- </p>
- <p>
- Questi la caccerà per ogne villa,<br>
- fin che l'avrà rimessa ne lo 'nferno,<br>
- là onde 'nvidia prima dipartilla.
- </p>
- <p>
- Ond' io per lo tuo me' penso e discerno<br>
- che tu mi segui, e io sarò tua guida,<br>
- e trarrotti di qui per loco etterno;
- </p>
- <p>
- ove udirai le disperate strida,<br>
- vedrai li antichi spiriti dolenti,<br>
- ch'a la seconda morte ciascun grida;
- </p>
- <p>
- e vederai color che son contenti<br>
- nel foco, perché speran di venire<br>
- quando che sia a le beate genti.
- </p>
- <p>
- A le quai poi se tu vorrai salire,<br>
- anima fia a ciò più di me degna:<br>
- con lei ti lascerò nel mio partire;
- </p>
- <p>
- ché quello imperador che là sù regna,<br>
- perch' i' fu' ribellante a la sua legge,<br>
- non vuol che 'n sua città per me si vegna.
- </p>
- <p>
- In tutte parti impera e quivi regge;<br>
- quivi è la sua città e l'alto seggio:<br>
- oh felice colui cu' ivi elegge!».
- </p>
- <p>
- E io a lui: «Poeta, io ti richeggio<br>
- per quello Dio che tu non conoscesti,<br>
- a ciò ch'io fugga questo male e peggio,
- </p>
- <p>
- che tu mi meni là dov' or dicesti,<br>
- sì ch'io veggia la porta di san Pietro<br>
- e color cui tu fai cotanto mesti».
- </p>
- <p>
- Allor si mosse, e io li tenni dietro.
- </p>
-</body>
-</html>
diff --git a/toolkit/components/narrate/test/moby_dick.html b/toolkit/components/narrate/test/moby_dick.html
deleted file mode 100644
index 0beaa20fd..000000000
--- a/toolkit/components/narrate/test/moby_dick.html
+++ /dev/null
@@ -1,218 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>Moby Dick - Chapter 1. Loomings</title>
-</head>
-<body>
- <h1>Moby Dick</h1>
- <h2>Chapter 1. Loomings</h2>
- <p>
- Call me Ishmael. <span>Some <span>years</span></span> ago—never mind how
- long precisely—having little or no money in my purse, and nothing particular
- to interest me on shore, I thought I would sail about a little and see the
- watery part of the world. It is a way I have of driving off the spleen and
- regulating the circulation. Whenever I find myself growing grim about the
- mouth; whenever it is a damp, drizzly November in my soul; whenever I find
- myself involuntarily pausing before coffin warehouses, and bringing up the
- rear of every funeral I meet; and especially whenever my hypos get such an
- upper hand of me, that it requires a strong moral principle to prevent me
- from deliberately stepping into the street, and methodically knocking
- people's hats off—then, I account it high time to get to sea as soon as I
- can. This is my substitute for pistol and ball. With a philosophical
- flourish Cato throws himself upon his sword; I quietly take to the ship.
- There is nothing surprising in this. If they but knew it, almost all men in
- their degree, some time or other, cherish very nearly the same feelings
- towards the ocean with me.
- </p>
- <p>
- There now is your insular city of the Manhattoes, belted round by wharves
- as Indian isles by coral reefs—commerce surrounds it with her surf.
- Right and left, the streets take you waterward. Its extreme downtown is
- the battery, where that noble mole is washed by waves, and cooled by
- breezes, which a few hours previous were out of sight of land. Look at the
- crowds of water-gazers there.
- </p>
- <p>
- Circumambulate the city of a dreamy Sabbath afternoon. Go from Corlears
- Hook to Coenties Slip, and from thence, by Whitehall, northward. What do
- you see?—Posted like silent sentinels all around the town, stand
- thousands upon thousands of mortal men fixed in ocean reveries. Some
- leaning against the spiles; some seated upon the pier-heads; some looking
- over the bulwarks of ships from China; some high aloft in the rigging, as
- if striving to get a still better seaward peep. But these are all
- landsmen; of week days pent up in lath and plaster—tied to counters,
- nailed to benches, clinched to desks. How then is this? Are the green
- fields gone? What do they here?
- </p>
- <p>
- But look! here come more crowds, pacing straight for the water, and
- seemingly bound for a dive. Strange! Nothing will content them but the
- extremest limit of the land; loitering under the shady lee of yonder
- warehouses will not suffice. No. They must get just as nigh the water as
- they possibly can without falling in. And there they stand—miles of
- them—leagues. Inlanders all, they come from lanes and alleys,
- streets and avenues—north, east, south, and west. Yet here they all
- unite. Tell me, does the magnetic virtue of the needles of the compasses
- of all those ships attract them thither?
- </p>
- <p>
- Once more. Say you are in the country; in some high land of lakes. Take
- almost any path you please, and ten to one it carries you down in a dale,
- and leaves you there by a pool in the stream. There is magic in it. Let
- the most absent-minded of men be plunged in his deepest reveries—stand
- that man on his legs, set his feet a-going, and he will infallibly lead
- you to water, if water there be in all that region. Should you ever be
- athirst in the great American desert, try this experiment, if your caravan
- happen to be supplied with a metaphysical professor. Yes, as every one
- knows, meditation and water are wedded for ever.
- </p>
- <p>
- But here is an artist. He desires to paint you the dreamiest, shadiest,
- quietest, most enchanting bit of romantic landscape in all the valley of
- the Saco. What is the chief element he employs? There stand his trees,
- each with a hollow trunk, as if a hermit and a crucifix were within; and
- here sleeps his meadow, and there sleep his cattle; and up from yonder
- cottage goes a sleepy smoke. Deep into distant woodlands winds a mazy way,
- reaching to overlapping spurs of mountains bathed in their hill-side blue.
- But though the picture lies thus tranced, and though this pine-tree shakes
- down its sighs like leaves upon this shepherd's head, yet all were vain,
- unless the shepherd's eye were fixed upon the magic stream before him. Go
- visit the Prairies in June, when for scores on scores of miles you wade
- knee-deep among Tiger-lilies—what is the one charm wanting?—Water—there
- is not a drop of water there! Were Niagara but a cataract of sand, would
- you travel your thousand miles to see it? Why did the poor poet of
- Tennessee, upon suddenly receiving two handfuls of silver, deliberate
- whether to buy him a coat, which he sadly needed, or invest his money in a
- pedestrian trip to Rockaway Beach? Why is almost every robust healthy boy
- with a robust healthy soul in him, at some time or other crazy to go to
- sea? Why upon your first voyage as a passenger, did you yourself feel such
- a mystical vibration, when first told that you and your ship were now out
- of sight of land? Why did the old Persians hold the sea holy? Why did the
- Greeks give it a separate deity, and own brother of Jove? Surely all this
- is not without meaning. And still deeper the meaning of that story of
- Narcissus, who because he could not grasp the tormenting, mild image he
- saw in the fountain, plunged into it and was drowned. But that same image,
- we ourselves see in all rivers and oceans. It is the image of the
- ungraspable phantom of life; and this is the key to it all.
- </p>
- <p>
- Now, when I say that I am in the habit of going to sea whenever I begin to
- grow hazy about the eyes, and begin to be over conscious of my lungs, I do
- not mean to have it inferred that I ever go to sea as a passenger. For to
- go as a passenger you must needs have a purse, and a purse is but a rag
- unless you have something in it. Besides, passengers get sea-sick—grow
- quarrelsome—don't sleep of nights—do not enjoy themselves
- much, as a general thing;—no, I never go as a passenger; nor, though
- I am something of a salt, do I ever go to sea as a Commodore, or a
- Captain, or a Cook. I abandon the glory and distinction of such offices to
- those who like them. For my part, I abominate all honourable respectable
- toils, trials, and tribulations of every kind whatsoever. It is quite as
- much as I can do to take care of myself, without taking care of ships,
- barques, brigs, schooners, and what not. And as for going as cook,—though
- I confess there is considerable glory in that, a cook being a sort of
- officer on ship-board—yet, somehow, I never fancied broiling fowls;—though
- once broiled, judiciously buttered, and judgmatically salted and peppered,
- there is no one who will speak more respectfully, not to say
- reverentially, of a broiled fowl than I will. It is out of the idolatrous
- dotings of the old Egyptians upon broiled ibis and roasted river horse,
- that you see the mummies of those creatures in their huge bake-houses the
- pyramids.
- </p>
- <p>
- No, when I go to sea, I go as a simple sailor, right before the mast,
- plumb down into the forecastle, aloft there to the royal mast-head. True,
- they rather order me about some, and make me jump from spar to spar, like
- a grasshopper in a May meadow. And at first, this sort of thing is
- unpleasant enough. It touches one's sense of honour, particularly if you
- come of an old established family in the land, the Van Rensselaers, or
- Randolphs, or Hardicanutes. And more than all, if just previous to putting
- your hand into the tar-pot, you have been lording it as a country
- schoolmaster, making the tallest boys stand in awe of you. The transition
- is a keen one, I assure you, from a schoolmaster to a sailor, and requires
- a strong decoction of Seneca and the Stoics to enable you to grin and bear
- it. But even this wears off in time.
- </p>
- <p>
- What of it, if some old hunks of a sea-captain orders me to get a broom
- and sweep down the decks? What does that indignity amount to, weighed, I
- mean, in the scales of the New Testament? Do you think the archangel
- Gabriel thinks anything the less of me, because I promptly and
- respectfully obey that old hunks in that particular instance? Who ain't a
- slave? Tell me that. Well, then, however the old sea-captains may order me
- about—however they may thump and punch me about, I have the
- satisfaction of knowing that it is all right; that everybody else is one
- way or other served in much the same way—either in a physical or
- metaphysical point of view, that is; and so the universal thump is passed
- round, and all hands should rub each other's shoulder-blades, and be
- content.
- </p>
- <p>
- Again, I always go to sea as a sailor, because they make a point of paying
- me for my trouble, whereas they never pay passengers a single penny that I
- ever heard of. On the contrary, passengers themselves must pay. And there
- is all the difference in the world between paying and being paid. The act
- of paying is perhaps the most uncomfortable infliction that the two
- orchard thieves entailed upon us. But <i>being paid</i>,—what will compare
- with it? The urbane activity with which a man receives money is really
- marvellous, considering that we so earnestly believe money to be the root
- of all earthly ills, and that on no account can a monied man enter heaven.
- Ah! how cheerfully we consign ourselves to perdition!
- </p>
- <p>
- Finally, I always go to sea as a sailor, because of the wholesome exercise
- and pure air of the fore-castle deck. For as in this world, head winds are
- far more prevalent than winds from astern (that is, if you never violate
- the Pythagorean maxim), so for the most part the Commodore on the
- quarter-deck gets his atmosphere at second hand from the sailors on the
- forecastle. He thinks he breathes it first; but not so. In much the same
- way do the commonalty lead their leaders in many other things, at the same
- time that the leaders little suspect it. But wherefore it was that after
- having repeatedly smelt the sea as a merchant sailor, I should now take it
- into my head to go on a whaling voyage; this the invisible police officer
- of the Fates, who has the constant surveillance of me, and secretly dogs
- me, and influences me in some unaccountable way—he can better answer
- than any one else. And, doubtless, my going on this whaling voyage, formed
- part of the grand programme of Providence that was drawn up a long time
- ago. It came in as a sort of brief interlude and solo between more
- extensive performances. I take it that this part of the bill must have run
- something like this:
- </p>
- <p>
- "<i>Grand Contested Election for the Presidency of the United States.</i>
- "WHALING VOYAGE BY ONE ISHMAEL. "BLOODY BATTLE IN AFFGHANISTAN."
- </p>
- <p>
- Though I cannot tell why it was exactly that those stage managers, the
- Fates, put me down for this shabby part of a whaling voyage, when others
- were set down for magnificent parts in high tragedies, and short and easy
- parts in genteel comedies, and jolly parts in farces—though I cannot
- tell why this was exactly; yet, now that I recall all the circumstances, I
- think I can see a little into the springs and motives which being
- cunningly presented to me under various disguises, induced me to set about
- performing the part I did, besides cajoling me into the delusion that it
- was a choice resulting from my own unbiased freewill and discriminating
- judgment.
- </p>
- <p>
- Chief among these motives was the overwhelming idea of the great whale
- himself. Such a portentous and mysterious monster roused all my curiosity.
- Then the wild and distant seas where he rolled his island bulk; the
- undeliverable, nameless perils of the whale; these, with all the attending
- marvels of a thousand Patagonian sights and sounds, helped to sway me to
- my wish. With other men, perhaps, such things would not have been
- inducements; but as for me, I am tormented with an everlasting itch for
- things remote. I love to sail forbidden seas, and land on barbarous
- coasts. Not ignoring what is good, I am quick to perceive a horror, and
- could still be social with it—would they let me—since it is
- but well to be on friendly terms with all the inmates of the place one
- lodges in.
- </p>
- <p>
- By reason of these things, then, the whaling voyage was welcome; the great
- flood-gates of the wonder-world swung open, and in the wild conceits that
- swayed me to my purpose, two and two there floated into my inmost soul,
- endless processions of the whale, and, mid most of them all, one grand
- hooded phantom, like a snow hill in the air.
- </p>
-</body>
-</html>