diff options
Diffstat (limited to 'editor/spellchecker/tests/test_multiple_content_languages.html')
-rw-r--r-- | editor/spellchecker/tests/test_multiple_content_languages.html | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/editor/spellchecker/tests/test_multiple_content_languages.html b/editor/spellchecker/tests/test_multiple_content_languages.html new file mode 100644 index 0000000000..c3357dec91 --- /dev/null +++ b/editor/spellchecker/tests/test_multiple_content_languages.html @@ -0,0 +1,176 @@ +<!DOCTYPE html> +<html> +<head> + <title>Test for multiple Content-Language values</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" href="/tests/SimpleTest/test.css"> +</head> +<body> +<p id="display"></p> +<iframe id="content"></iframe> + +<pre id="test"> +<script class="testbody"> + +/** Test for multiple Content-Language values **/ +/** Visit the elements defined above and check the dictionaries we got **/ +SimpleTest.waitForExplicitFinish(); +var content = document.getElementById("content"); + +var tests = [ + // text area, value of spellchecker.dictionary, result. + // Result: Document language. + [ "none", "", ["en-US", "en-GB"] ], + + // Result: Element language. + [ "en-GB", "", ["en-GB"] ], + // Result: Random en-* or en-US (if application locale is en-US). + [ "en-ZA-not-avail", "", ["*"] ], + [ "en", "", ["*"] ], + // Result: Locale. + [ "ko-not-avail", "", ["en-US"] ], + + // Result: Document language, plus preference value in all cases. + [ "none", "en-AU", ["en-US", "en-GB", "en-AU"] ], + [ "en-ZA-not-avail", "en-AU", ["en-AU"] ], + [ "ko-not-avail", "en-AU", ["en-AU"] ], + + // Result: Document language, plus first matching preference language. + [ "none", "en-AU,en-US", ["en-US", "en-GB", "en-AU"] ], + // Result: First matching preference language. + [ "en-ZA-not-avail", "en-AU,en-US", ["en-AU"] ], + // Result: Fall back to preference languages. + [ "ko-not-avail", "en-AU,en-US", ["en-AU", "en-US"] ], + + // Result: Random en-*. + [ "en-ZA-not-avail", "de-DE", ["*"] ], + // Result: Preference value. + [ "ko-not-avail", "de-DE", ["de-DE"] ], + ]; + +var loadCount = 0; +var retrying = false; +var script; + +var loadListener = async function(evt) { + if (loadCount == 0) { + script = SpecialPowers.loadChromeScript(function() { + /* eslint-env mozilla/chrome-script */ + // eslint-disable-next-line mozilla/use-services + var dir = Cc["@mozilla.org/file/directory_service;1"] + .getService(Ci.nsIProperties) + .get("CurWorkD", Ci.nsIFile); + dir.append("tests"); + dir.append("editor"); + dir.append("spellchecker"); + dir.append("tests"); + + var hunspell = Cc["@mozilla.org/spellchecker/engine;1"] + .getService(Ci.mozISpellCheckingEngine); + + // Install en-GB, en-AU and de-DE dictionaries. + var en_GB = dir.clone(); + var en_AU = dir.clone(); + var de_DE = dir.clone(); + en_GB.append("en-GB"); + en_AU.append("en-AU"); + de_DE.append("de-DE"); + hunspell.addDirectory(en_GB); + hunspell.addDirectory(en_AU); + hunspell.addDirectory(de_DE); + + addMessageListener("check-existence", + () => [en_GB.exists(), en_AU.exists(), + de_DE.exists()]); + addMessageListener("destroy", () => { + hunspell.removeDirectory(en_GB); + hunspell.removeDirectory(en_AU); + hunspell.removeDirectory(de_DE); + }); + }); + var existenceChecks = await script.sendQuery("check-existence"); + is(existenceChecks[0], true, "true expected (en-GB directory should exist)"); + is(existenceChecks[1], true, "true expected (en-AU directory should exist)"); + is(existenceChecks[2], true, "true expected (de-DE directory should exist)"); + } + + SpecialPowers.pushPrefEnv({set: [["spellchecker.dictionary", tests[loadCount][1]]]}, + function() { continueTest(evt); }); +}; + +function continueTest(evt) { + var doc = evt.target.contentDocument; + var elem = doc.getElementById(tests[loadCount][0]); + var editor = SpecialPowers.wrap(elem).editor; + editor.setSpellcheckUserOverride(true); + var inlineSpellChecker = editor.getInlineSpellChecker(true); + const is_en_US = SpecialPowers.Services.locale.appLocaleAsBCP47 == "en-US"; + + const { onSpellCheck } = SpecialPowers.ChromeUtils.import( + "resource://testing-common/AsyncSpellCheckTestHelper.jsm" + ); + onSpellCheck(elem, async function() { + var spellchecker = inlineSpellChecker.spellChecker; + let currentDictionaries; + try { + currentDictionaries = spellchecker.getCurrentDictionaries(); + } catch (e) {} + + if (!currentDictionaries && !retrying) { + // It's possible for an asynchronous font-list update to cause a reflow + // that disrupts the async spell-check and results in not getting a + // current dictionary here; if that happens, we retry the same testcase + // by reloading the iframe without bumping loadCount. + info(`No current dictionary: retrying testcase ${loadCount}`); + retrying = true; + } else { + let expectedDictionaries = tests[loadCount][2]; + let dictionaryArray = Array.from(currentDictionaries); + is( + dictionaryArray.length, + expectedDictionaries.length, + "Expected matching dictionary count" + ); + if (expectedDictionaries[0] != "*") { + ok( + dictionaryArray.every(dict => expectedDictionaries.includes(dict)), + "active dictionaries should match expectation" + ); + } else if (is_en_US && tests[loadCount][0].startsWith("en")) { + // Current application locale is en-US and content lang is en or + // en-unknown, so we should use en-US dictionary as default. + is( + dictionaryArray[0], + "en-US", + "expected en-US that is application locale" + ); + } else { + let dict = dictionaryArray[0]; + var gotEn = (dict == "en-GB" || dict == "en-AU" || dict == "en-US"); + is(gotEn, true, "expected en-AU or en-GB or en-US"); + } + + loadCount++; + retrying = false; + } + + if (loadCount < tests.length) { + // Load the iframe again. + content.src = "http://mochi.test:8888/tests/editor/spellchecker/tests/multiple_content_languages_subframe.html?firstload=false"; + } else { + // Remove the fake dictionaries again, since it's otherwise picked up by later tests. + await script.sendQuery("destroy"); + + SimpleTest.finish(); + } + }); +} + +content.addEventListener("load", loadListener); + +content.src = "http://mochi.test:8888/tests/editor/spellchecker/tests/multiple_content_languages_subframe.html?firstload=true"; + +</script> +</pre> +</body> +</html> |