Source code

Revision control

Copy as Markdown

Other Tools

let uri =
let protocol = Services.io
.getProtocolHandler("resource")
.QueryInterface(Ci.nsIResProtocolHandler);
protocol.setSubstitution("l10n-test", Services.io.newURI(uri));
// Since we want the mock source to work with all locales, we're going
// to register it for currently used locales, and we'll put the path that
// doesn't use the `{locale}` component to make it work irrelevant of
// what locale the mochitest is running in.
//
// Notice: we're using a `chrome://` protocol here only for convenience reasons.
// Real sources should use `resource://` protocol.
let locales = Services.locale.appLocalesAsBCP47;
// This source is actually using a real `FileSource` instead of a mocked one,
// because we want to test that fetching real I/O out of the `uri` works in non-system-principal.
let source = new L10nFileSource("test", "app", locales, `${uri}localization/`);
L10nRegistry.getInstance().registerSources([source]);
registerCleanupFunction(() => {
protocol.setSubstitution("l10n-test", null);
L10nRegistry.getInstance().removeSources(["test"]);
SpecialPowers.pushPrefEnv({
set: [["dom.ipc.processPrelaunch.enabled", true]],
});
});
const kChildPage = getRootDirectory(gTestPath) + "test.html";
const kAboutPagesRegistered = Promise.all([
BrowserTestUtils.registerAboutPage(
registerCleanupFunction,
"test-about-l10n-child",
kChildPage,
Ci.nsIAboutModule.URI_MUST_LOAD_IN_CHILD |
Ci.nsIAboutModule.URI_SAFE_FOR_UNTRUSTED_CONTENT |
Ci.nsIAboutModule.ALLOW_SCRIPT
),
]);
add_task(async () => {
// Bug 1640333 - windows fails (sometimes) to ever get document.l10n.ready
// if e10s process caching is enabled
await SpecialPowers.pushPrefEnv({
set: [
["dom.ipc.processPrelaunch.enabled", false],
["dom.security.skip_about_page_has_csp_assert", true],
],
});
await kAboutPagesRegistered;
await BrowserTestUtils.withNewTab(
"about:test-about-l10n-child",
async browser => {
await SpecialPowers.spawn(browser, [], async function () {
let document = content.document;
let window = document.defaultView;
await document.testsReadyPromise;
let principal = SpecialPowers.wrap(document).nodePrincipal;
is(
principal.spec,
"about:test-about-l10n-child",
"correct content principal"
);
let desc = document.getElementById("main-desc");
// We can test here for a particular value because we're
// using a mock file source which is locale independent.
//
// If you're writing a test that verifies that a UI
// widget got real localization, you should not rely on
// the particular value, but rather on the content not
// being empty (to keep the test pass in non-en-US locales).
is(desc.textContent, "This is a mock page title");
// Test for l10n.getAttributes
let label = document.getElementById("label1");
let l10nArgs = document.l10n.getAttributes(label);
is(l10nArgs.id, "subtitle");
is(l10nArgs.args.name, "Firefox");
// Test for manual value formatting
let customMsg = document.getElementById("customMessage").textContent;
is(customMsg, "This is a custom message formatted from JS.");
// Since we applied the `data-l10n-id` attribute
// on `label` in this microtask, we have to wait for
// the next paint to verify that the MutationObserver
// applied the translation.
await new Promise(resolve => {
let verifyL10n = () => {
if (!label.textContent.includes("Firefox")) {
window.requestAnimationFrame(verifyL10n);
} else {
resolve();
}
};
window.requestAnimationFrame(verifyL10n);
});
});
}
);
});