Dactyloidae/toolkit/components/webextensions/test/mochitest/test_ext_i18n.html

432 lines
12 KiB
HTML
Raw Normal View History

<!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 aujourdhui appelé République française. Pour dautres 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>