blob: c840009ab657dacb0f05e80123866e273f4f06e5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
Cu.importGlobalProperties(["fetch"]);
const { ExtensionData } = ChromeUtils.importESModule(
"resource://gre/modules/Extension.sys.mjs"
);
const SEARCH_EXTENSIONS_PATH = "resource://search-extensions";
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}`
);
}
}
}
});
|