Files
tubestation/waterfox/browser/extensions/common/RDFManifestConverter.jsm
Alex Kontos 8252e45d0f feat: implement privileged extension support
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)
2025-11-03 16:04:54 +00:00

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;
}
}