diff options
Diffstat (limited to 'toolkit/components/webextensions/test/mochitest/test_ext_i18n.html')
-rw-r--r-- | toolkit/components/webextensions/test/mochitest/test_ext_i18n.html | 432 |
1 files changed, 432 insertions, 0 deletions
diff --git a/toolkit/components/webextensions/test/mochitest/test_ext_i18n.html b/toolkit/components/webextensions/test/mochitest/test_ext_i18n.html new file mode 100644 index 000000000..1f7330bbb --- /dev/null +++ b/toolkit/components/webextensions/test/mochitest/test_ext_i18n.html @@ -0,0 +1,432 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset="utf-8"> + <title>Test for WebExtension localization APIs</title> + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script> + <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script> + <script type="text/javascript" src="head.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> +</head> +<body> + +<script type="text/javascript"> +"use strict"; + +SimpleTest.registerCleanupFunction(() => { SpecialPowers.clearUserPref("intl.accept_languages"); }); +SimpleTest.registerCleanupFunction(() => { SpecialPowers.clearUserPref("general.useragent.locale"); }); + +add_task(function* test_i18n() { + function runTests(assertEq) { + let _ = browser.i18n.getMessage.bind(browser.i18n); + + let url = browser.runtime.getURL("/"); + assertEq(url, `moz-extension://${_("@@extension_id")}/`, "@@extension_id builtin message"); + + assertEq("Foo.", _("Foo"), "Simple message in selected locale."); + + assertEq("(bar)", _("bar"), "Simple message fallback in default locale."); + + assertEq("", _("some-unknown-locale-string"), "Unknown locale string."); + + assertEq("", _("@@unknown_builtin_string"), "Unknown built-in string."); + assertEq("", _("@@bidi_unknown_builtin_string"), "Unknown built-in bidi string."); + + assertEq("Føo.", _("Föo"), "Multi-byte message in selected locale."); + + let substitutions = []; + substitutions[4] = "5"; + substitutions[13] = "14"; + + assertEq("'$0' '14' '' '5' '$$$$' '$'.", _("basic_substitutions", substitutions), + "Basic numeric substitutions"); + + assertEq("'$0' '' 'just a string' '' '$$$$' '$'.", _("basic_substitutions", "just a string"), + "Basic numeric substitutions, with non-array value"); + + let values = _("named_placeholder_substitutions", ["(subst $1 $2)", "(2 $1 $2)"]).split("\n"); + + assertEq("_foo_ (subst $1 $2) _bar_", values[0], "Named and numeric substitution"); + + assertEq("(2 $1 $2)", values[1], "Numeric substitution amid named placeholders"); + + assertEq("$bad name$", values[2], "Named placeholder with invalid key"); + + assertEq("", values[3], "Named placeholder with an invalid value"); + + assertEq("Accepted, but shouldn't break.", values[4], "Named placeholder with a strange content value"); + + assertEq("$foo", values[5], "Non-placeholder token that should be ignored"); + } + + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + "default_locale": "jp", + + content_scripts: [ + {"matches": ["http://mochi.test/*/file_sample.html"], + "js": ["content.js"]}, + ], + }, + + + files: { + "_locales/en_US/messages.json": { + "foo": { + "message": "Foo.", + "description": "foo", + }, + + "föo": { + "message": "Føo.", + "description": "foo", + }, + + "basic_substitutions": { + "message": "'$0' '$14' '$1' '$5' '$$$$$' '$$'.", + "description": "foo", + }, + + "Named_placeholder_substitutions": { + "message": "$Foo$\n$2\n$bad name$\n$bad_value$\n$bad_content_value$\n$foo", + "description": "foo", + "placeholders": { + "foO": { + "content": "_foo_ $1 _bar_", + "description": "foo", + }, + + "bad name": { + "content": "Nope.", + "description": "bad name", + }, + + "bad_value": "Nope.", + + "bad_content_value": { + "content": ["Accepted, but shouldn't break."], + "description": "bad value", + }, + }, + }, + + "broken_placeholders": { + "message": "$broken$", + "description": "broken placeholders", + "placeholders": "foo.", + }, + }, + + "_locales/jp/messages.json": { + "foo": { + "message": "(foo)", + "description": "foo", + }, + + "bar": { + "message": "(bar)", + "description": "bar", + }, + }, + + "content.js": "new " + function(runTestsFn) { + runTestsFn((...args) => { + browser.runtime.sendMessage(["assertEq", ...args]); + }); + + browser.runtime.sendMessage(["content-script-finished"]); + } + `(${runTests})`, + }, + + background: "new " + function(runTestsFn) { + browser.runtime.onMessage.addListener(([msg, ...args]) => { + if (msg == "assertEq") { + browser.test.assertEq(...args); + } else { + browser.test.sendMessage(msg, ...args); + } + }); + + runTestsFn(browser.test.assertEq.bind(browser.test)); + } + `(${runTests})`, + }); + + yield extension.startup(); + + let win = window.open("file_sample.html"); + yield extension.awaitMessage("content-script-finished"); + win.close(); + + yield extension.unload(); +}); + +add_task(function* test_get_accept_languages() { + function background() { + function checkResults(source, results, expected) { + browser.test.assertEq( + expected.length, + results.length, + `got expected number of languages in ${source}`); + results.forEach((lang, index) => { + browser.test.assertEq( + expected[index], + lang, + `got expected language in ${source}`); + }); + } + + let tabId; + + browser.tabs.query({currentWindow: true, active: true}, tabs => { + tabId = tabs[0].id; + browser.test.sendMessage("ready"); + }); + + browser.test.onMessage.addListener(async ([msg, expected]) => { + let contentResults = await browser.tabs.sendMessage(tabId, "get-results"); + let backgroundResults = await browser.i18n.getAcceptLanguages(); + + checkResults("contentScript", contentResults, expected); + checkResults("background", backgroundResults, expected); + + browser.test.sendMessage("done"); + }); + } + + function content() { + browser.runtime.onMessage.addListener((msg, sender, respond) => { + browser.i18n.getAcceptLanguages(respond); + return true; + }); + } + + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + "content_scripts": [{ + "matches": ["http://mochi.test/*/file_sample.html"], + "run_at": "document_start", + "js": ["content_script.js"], + }], + }, + + background, + + files: { + "content_script.js": content, + }, + }); + + let win = window.open("file_sample.html"); + + yield extension.startup(); + yield extension.awaitMessage("ready"); + + let expectedLangs = ["en-US", "en"]; + extension.sendMessage(["expect-results", expectedLangs]); + yield extension.awaitMessage("done"); + + expectedLangs = ["en-US", "en", "fr-CA", "fr"]; + SpecialPowers.setCharPref("intl.accept_languages", expectedLangs.toString()); + extension.sendMessage(["expect-results", expectedLangs]); + yield extension.awaitMessage("done"); + SpecialPowers.clearUserPref("intl.accept_languages"); + + win.close(); + + yield extension.unload(); +}); + +add_task(function* test_get_ui_language() { + function getResults() { + return { + getUILanguage: browser.i18n.getUILanguage(), + getMessage: browser.i18n.getMessage("@@ui_locale"), + }; + } + + function background(getResultsFn) { + function checkResults(source, results, expected) { + browser.test.assertEq( + expected, + results.getUILanguage, + `Got expected getUILanguage result in ${source}` + ); + browser.test.assertEq( + expected, + results.getMessage, + `Got expected getMessage result in ${source}` + ); + } + + let tabId; + + browser.test.onMessage.addListener(([msg, expected]) => { + browser.tabs.sendMessage(tabId, "get-results", result => { + checkResults("contentScript", result, expected); + checkResults("background", getResultsFn(), expected); + + browser.test.sendMessage("done"); + }); + }); + + browser.tabs.query({currentWindow: true, active: true}, tabs => { + tabId = tabs[0].id; + browser.test.sendMessage("ready"); + }); + } + + function content(getResultsFn) { + browser.runtime.onMessage.addListener((msg, sender, respond) => { + respond(getResultsFn()); + }); + } + + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + "content_scripts": [{ + "matches": ["http://mochi.test/*/file_sample.html"], + "run_at": "document_start", + "js": ["content_script.js"], + }], + }, + + background: `(${background})(${getResults})`, + + files: { + "content_script.js": `(${content})(${getResults})`, + }, + }); + + let win = window.open("file_sample.html"); + + yield extension.startup(); + yield extension.awaitMessage("ready"); + + extension.sendMessage(["expect-results", "en_US"]); + yield extension.awaitMessage("done"); + + SpecialPowers.setCharPref("general.useragent.locale", "he"); + + extension.sendMessage(["expect-results", "he"]); + yield extension.awaitMessage("done"); + + win.close(); + + yield extension.unload(); +}); + + +add_task(function* test_detect_language() { + const af_string = " aam skukuza die naam beteken hy wat skoonvee of hy wat alles onderstebo keer wysig " + + "bosveldkampe boskampe is kleiner afgeleë ruskampe wat oor min fasiliteite beskik daar is geen restaurante " + + "of winkels nie en slegs oornagbesoekers word toegelaat bateleur"; + // String with intermixed French/English text + const fr_en_string = "France is the largest country in Western Europe and the third-largest in Europe as a whole. " + + "A accès aux chiens et aux frontaux qui lui ont été il peut consulter et modifier ses collections et exporter " + + "Cet article concerne le pays européen aujourd’hui appelé République française. Pour d’autres usages du nom France, " + + "Pour une aide rapide et effective, veuiller trouver votre aide dans le menu ci-dessus." + + "Motoring events began soon after the construction of the first successful gasoline-fueled automobiles. The quick brown fox jumped over the lazy dog"; + + function background() { + function checkResult(source, result, expected) { + browser.test.assertEq(expected.isReliable, result.isReliable, "result.confident is true"); + browser.test.assertEq( + expected.languages.length, + result.languages.length, + `result.languages contains the expected number of languages in ${source}`); + expected.languages.forEach((lang, index) => { + browser.test.assertEq( + lang.percentage, + result.languages[index].percentage, + `element ${index} of result.languages array has the expected percentage in ${source}`); + browser.test.assertEq( + lang.language, + result.languages[index].language, + `element ${index} of result.languages array has the expected language in ${source}`); + }); + } + + let tabId; + + browser.tabs.query({currentWindow: true, active: true}, tabs => { + tabId = tabs[0].id; + browser.test.sendMessage("ready"); + }); + + browser.test.onMessage.addListener(async ([msg, expected]) => { + let backgroundResults = await browser.i18n.detectLanguage(msg); + let contentResults = await browser.tabs.sendMessage(tabId, msg); + + checkResult("background", backgroundResults, expected); + checkResult("contentScript", contentResults, expected); + + browser.test.sendMessage("done"); + }); + } + + function content() { + browser.runtime.onMessage.addListener((msg, sender, respond) => { + browser.i18n.detectLanguage(msg, respond); + return true; + }); + } + + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + "content_scripts": [{ + "matches": ["http://mochi.test/*/file_sample.html"], + "run_at": "document_start", + "js": ["content_script.js"], + }], + }, + + background, + + files: { + "content_script.js": content, + }, + }); + + let win = window.open("file_sample.html"); + + yield extension.startup(); + yield extension.awaitMessage("ready"); + + let expected = { + isReliable: true, + languages: [ + { + language: "fr", + percentage: 67, + }, + { + language: "en", + percentage: 32, + }, + ], + }; + extension.sendMessage([fr_en_string, expected]); + yield extension.awaitMessage("done"); + + expected = { + isReliable: true, + languages: [ + { + language: "af", + percentage: 99, + }, + ], + }; + extension.sendMessage([af_string, expected]); + yield extension.awaitMessage("done"); + + win.close(); + + yield extension.unload(); +}); + +</script> + +</body> +</html> |