Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'android'
- Manifest: toolkit/components/search/tests/xpcshell/xpcshell.toml
/* Any copyright is dedicated to the Public Domain.
"use strict";
const { ExtensionData } = ChromeUtils.importESModule(
"resource://gre/modules/Extension.sys.mjs"
);
function getFileURI(resourceURI) {
let resHandler = Services.io
.getProtocolHandler("resource")
.QueryInterface(Ci.nsIResProtocolHandler);
let filePath = resHandler.resolveURI(Services.io.newURI(resourceURI));
return Services.io.newURI(filePath);
}
async function getSearchExtensions() {
// Fetching the root will give us the directory listing which we can parse
// for each file name
let list = await fetch(`${SEARCH_EXTENSIONS_PATH}/`).then(req => req.text());
return list
.split("\n")
.slice(2)
.reduce((acc, line) => {
let parts = line.split(" ");
if (parts.length > 2 && !parts[1].endsWith(".json")) {
// When the directory listing comes from omni jar each engine
// has a trailing slash (engine/) which we dont get locally, or want.
acc.push(parts[1].split("/")[0]);
}
return acc;
}, []);
}
add_task(async function test_validate_manifest() {
let searchExtensions = await getSearchExtensions();
ok(
!!searchExtensions.length,
`Found ${searchExtensions.length} search extensions`
);
for (const xpi of searchExtensions) {
info(`loading: ${SEARCH_EXTENSIONS_PATH}/${xpi}/`);
let fileURI = getFileURI(`${SEARCH_EXTENSIONS_PATH}/${xpi}/`);
let extension = new ExtensionData(fileURI, false);
await extension.loadManifest();
let locales = await extension.promiseLocales();
for (let locale of locales.keys()) {
try {
let manifest = await extension.getLocalizedManifest(locale);
ok(!!manifest, `parsed manifest ${xpi.leafName} in ${locale}`);
} catch (e) {
ok(
false,
`FAIL manifest for ${xpi.leafName} in locale ${locale} failed ${e} :: ${e.stack}`
);
}
}
}
});