Also includes: * feat: improve support for bootstrapped extensions Added support for custom preference pages. * fix: incorrect loading order for bootstrap loader * fix: BootstrapLoader (cherry picked from commit eb40811e464688c7d2fc58a4330272dde1ec7937)
139 lines
3.1 KiB
JavaScript
139 lines
3.1 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
"use strict";
|
|
|
|
var EXPORTED_SYMBOLS = ["InstallRDF"];
|
|
|
|
ChromeUtils.defineModuleGetter(
|
|
this,
|
|
"RDFDataSource",
|
|
"resource:///modules/RDFDataSource.jsm"
|
|
);
|
|
|
|
const RDFURI_INSTALL_MANIFEST_ROOT = "urn:mozilla:install-manifest";
|
|
|
|
function EM_R(aProperty) {
|
|
return `http://www.mozilla.org/2004/em-rdf#${aProperty}`;
|
|
}
|
|
|
|
function getValue(literal) {
|
|
return literal && literal.getValue();
|
|
}
|
|
|
|
function getProperty(resource, property) {
|
|
return getValue(resource.getProperty(EM_R(property)));
|
|
}
|
|
|
|
class Manifest {
|
|
constructor(ds) {
|
|
this.ds = ds;
|
|
}
|
|
|
|
static loadFromString(text) {
|
|
return new this(RDFDataSource.loadFromString(text));
|
|
}
|
|
|
|
static loadFromBuffer(buffer) {
|
|
return new this(RDFDataSource.loadFromBuffer(buffer));
|
|
}
|
|
|
|
static async loadFromFile(uri) {
|
|
return new this(await RDFDataSource.loadFromFile(uri));
|
|
}
|
|
}
|
|
|
|
class InstallRDF extends Manifest {
|
|
_readProps(source, obj, props) {
|
|
for (let prop of props) {
|
|
let val = getProperty(source, prop);
|
|
if (val != null) {
|
|
obj[prop] = val;
|
|
}
|
|
}
|
|
}
|
|
|
|
_readArrayProp(source, obj, prop, target, decode = getValue) {
|
|
let result = Array.from(source.getObjects(EM_R(prop)), target =>
|
|
decode(target)
|
|
);
|
|
if (result.length) {
|
|
obj[target] = result;
|
|
}
|
|
}
|
|
|
|
_readArrayProps(source, obj, props, decode = getValue) {
|
|
for (let [prop, target] of Object.entries(props)) {
|
|
this._readArrayProp(source, obj, prop, target, decode);
|
|
}
|
|
}
|
|
|
|
_readLocaleStrings(source, obj) {
|
|
this._readProps(source, obj, [
|
|
"name",
|
|
"description",
|
|
"creator",
|
|
"homepageURL",
|
|
]);
|
|
this._readArrayProps(source, obj, {
|
|
locale: "locales",
|
|
developer: "developers",
|
|
translator: "translators",
|
|
contributor: "contributors",
|
|
});
|
|
}
|
|
|
|
decode() {
|
|
let root = this.ds.getResource(RDFURI_INSTALL_MANIFEST_ROOT);
|
|
let result = {};
|
|
|
|
let props = [
|
|
"id",
|
|
"version",
|
|
"type",
|
|
"updateURL",
|
|
"optionsURL",
|
|
"optionsType",
|
|
"aboutURL",
|
|
"iconURL",
|
|
"bootstrap",
|
|
"unpack",
|
|
"strictCompatibility",
|
|
];
|
|
this._readProps(root, result, props);
|
|
|
|
let decodeTargetApplication = source => {
|
|
let app = {};
|
|
this._readProps(source, app, ["id", "minVersion", "maxVersion"]);
|
|
return app;
|
|
};
|
|
|
|
let decodeLocale = source => {
|
|
let localized = {};
|
|
this._readLocaleStrings(source, localized);
|
|
return localized;
|
|
};
|
|
|
|
this._readLocaleStrings(root, result);
|
|
|
|
this._readArrayProps(root, result, { targetPlatform: "targetPlatforms" });
|
|
this._readArrayProps(
|
|
root,
|
|
result,
|
|
{ targetApplication: "targetApplications" },
|
|
decodeTargetApplication
|
|
);
|
|
this._readArrayProps(
|
|
root,
|
|
result,
|
|
{ localized: "localized" },
|
|
decodeLocale
|
|
);
|
|
this._readArrayProps(root, result, { dependency: "dependencies" }, source =>
|
|
getProperty(source, "id")
|
|
);
|
|
|
|
return result;
|
|
}
|
|
}
|