Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'android'
- Manifest: toolkit/mozapps/extensions/test/xpcshell/xpcshell.toml
"user strict";
const PREF_GETADDONS_CACHE_ENABLED = "extensions.getAddons.cache.enabled";
const PREF_METADATA_LASTUPDATE = "extensions.getAddons.cache.lastUpdate";
Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, true);
AddonTestUtils.init(this);
AddonTestUtils.overrideCertDB();
AddonTestUtils.createAppInfo(
"xpcshell@tests.mozilla.org",
"XPCShell",
"42",
"42"
);
let server = AddonTestUtils.createHttpServer({ hosts: ["example.com"] });
server.registerDirectory("/data/", do_get_file("data"));
// Use %LOCALE% as the default pref does. It is set from appLocaleAsBCP47.
Services.prefs.setStringPref(
PREF_GETADDONS_BYIDS,
);
const TEST_ADDON_ID = "test_AddonRepository_1@tests.mozilla.org";
const repositoryAddons = {
"test_AddonRepository_1@tests.mozilla.org": {
name: "Repo Add-on 1",
type: "extension",
guid: TEST_ADDON_ID,
current_version: {
version: "2.1",
files: [
{
platform: "all",
size: 9,
},
],
},
},
"langpack-und@test.mozilla.org": {
// included only to avoid exceptions in AddonRepository
name: "und langpack",
type: "language",
guid: "langpack-und@test.mozilla.org",
current_version: {
version: "1.1",
files: [
{
platform: "all",
size: 9,
},
],
},
},
};
server.registerPathHandler("/addons.json", (request, response) => {
let search = new URLSearchParams(request.queryString);
let IDs = search.get("guids").split(",");
let locale = search.get("locale");
let repositoryData = {
page_size: 25,
page_count: 1,
count: 0,
next: null,
previous: null,
results: [],
};
for (let id of IDs) {
let data = JSON.parse(JSON.stringify(repositoryAddons[id]));
data.summary = `This is an ${locale} addon data object`;
data.description = `Full Description ${locale}`;
repositoryData.results.push(data);
}
repositoryData.count = repositoryData.results.length;
// The request contains the IDs to retreive, but we're just handling the
// two test addons so it's static data.
response.setHeader("content-type", "application/json");
response.write(JSON.stringify(repositoryData));
});
const ADDONS = [
{
manifest: {
name: "XPI Add-on 1",
version: "1.1",
description: "XPI Add-on 1 - Description",
developer: {
name: "XPI Add-on 1 - Author",
},
icons: {
32: "icon.png",
},
options_ui: {
page: "options.html",
},
browser_specific_settings: {
gecko: { id: TEST_ADDON_ID },
},
},
},
{
// Necessary to provide the "und" locale
manifest: {
name: "und Language Pack",
version: "1.0",
manifest_version: 2,
browser_specific_settings: {
gecko: {
id: "langpack-und@test.mozilla.org",
},
},
sources: {
browser: {
base_path: "browser/",
},
},
langpack_id: "und",
languages: {
und: {
chrome_resources: {
global: "chrome/und/locale/und/global/",
},
version: "20171001190118",
},
},
author: "Mozilla Localization Task Force",
description: "Language pack for Testy for und",
},
},
];
const ADDON_FILES = ADDONS.map(addon =>
AddonTestUtils.createTempWebExtensionFile(addon)
);
const REQ_LOC_CHANGE_EVENT = "intl:requested-locales-changed";
function promiseLocaleChanged(requestedLocale) {
if (Services.locale.appLocaleAsBCP47 == requestedLocale) {
return Promise.resolve();
}
return new Promise(resolve => {
let localeObserver = {
observe(aSubject, aTopic) {
switch (aTopic) {
case REQ_LOC_CHANGE_EVENT:
let reqLocs = Services.locale.requestedLocales;
equal(reqLocs[0], requestedLocale);
Services.obs.removeObserver(localeObserver, REQ_LOC_CHANGE_EVENT);
resolve();
}
},
};
Services.obs.addObserver(localeObserver, REQ_LOC_CHANGE_EVENT);
Services.locale.requestedLocales = [requestedLocale];
});
}
function promiseMetaDataUpdate() {
return new Promise(resolve => {
let listener = () => {
Services.prefs.removeObserver(PREF_METADATA_LASTUPDATE, listener);
resolve();
};
Services.prefs.addObserver(PREF_METADATA_LASTUPDATE, listener);
});
}
function promiseLocale(locale) {
return Promise.all([promiseLocaleChanged(locale), promiseMetaDataUpdate()]);
}
add_task(async function setup() {
await promiseStartupManager();
for (let xpi of ADDON_FILES) {
await promiseInstallFile(xpi);
}
});
add_task(async function test_locale_change() {
await promiseLocale("en-US");
let addon = await AddonRepository.getCachedAddonByID(TEST_ADDON_ID);
Assert.ok(addon.description.includes("en-US"), "description is en-us");
Assert.ok(
addon.fullDescription.includes("en-US"),
"fullDescription is en-us"
);
// This pref is a 1s resolution, set it to zero so the
// next test can wait on it being updated again.
Services.prefs.setIntPref(PREF_METADATA_LASTUPDATE, 0);
// Wait for the last update timestamp to be updated.
await promiseLocale("und");
addon = await AddonRepository.getCachedAddonByID(TEST_ADDON_ID);
Assert.ok(
addon.description.includes("und"),
`description is ${addon.description}`
);
Assert.ok(
addon.fullDescription.includes("und"),
`fullDescription is ${addon.fullDescription}`
);
});