mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-21 09:15:35 +00:00
Bug 1457749: Part 2 - Update UpdateRDFConverter to use RDFDataSource.jsm. r=Mossop
MozReview-Commit-ID: HbJ3vBSBXH2 --HG-- extra : source : 7f657f4d30880395e20f990c5c97ece275a61de2
This commit is contained in:
parent
6151d7e69a
commit
03efd881e7
@ -5,155 +5,138 @@
|
||||
|
||||
var EXPORTED_SYMBOLS = ["UpdateRDFConverter"];
|
||||
|
||||
const PREFIX_NS_EM = "http://www.mozilla.org/2004/em-rdf#";
|
||||
ChromeUtils.defineModuleGetter(this, "RDFDataSource",
|
||||
"resource://gre/modules/addons/RDFDataSource.jsm");
|
||||
ChromeUtils.defineModuleGetter(this, "Services",
|
||||
"resource://gre/modules/Services.jsm");
|
||||
|
||||
const PREFIX_ITEM = "urn:mozilla:item:";
|
||||
const PREFIX_EXTENSION = "urn:mozilla:extension:";
|
||||
const PREFIX_THEME = "urn:mozilla:theme:";
|
||||
|
||||
const TOOLKIT_ID = "toolkit@mozilla.org";
|
||||
|
||||
ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
function EM_R(aProperty) {
|
||||
return `http://www.mozilla.org/2004/em-rdf#${aProperty}`;
|
||||
}
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetters(this, {
|
||||
gRDF: ["@mozilla.org/rdf/rdf-service;1", "nsIRDFService"],
|
||||
containerUtils: ["@mozilla.org/rdf/container-utils;1", "nsIRDFContainerUtils"],
|
||||
});
|
||||
function getValue(literal) {
|
||||
return literal && literal.getValue();
|
||||
}
|
||||
|
||||
const RDFContainer = Components.Constructor(
|
||||
"@mozilla.org/rdf/container;1", "nsIRDFContainer", "Init");
|
||||
const RDFDataSource = Components.Constructor(
|
||||
"@mozilla.org/rdf/datasource;1?name=in-memory-datasource", "nsIRDFDataSource");
|
||||
const RDFParser = Components.Constructor(
|
||||
"@mozilla.org/rdf/xml-parser;1", "nsIRDFXMLParser");
|
||||
function getProperty(resource, property) {
|
||||
return getValue(resource.getProperty(EM_R(property)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses an RDF style update manifest into a JSON-style update
|
||||
* manifest.
|
||||
*
|
||||
* @param {XMLHttpRequest> aRequest
|
||||
* The XMLHttpRequest that has retrieved the update manifest
|
||||
* @returns {object} a JSON update manifest.
|
||||
*/
|
||||
function parseRDFManifest(aRequest) {
|
||||
function EM_R(aProp) {
|
||||
return gRDF.GetResource(PREFIX_NS_EM + aProp);
|
||||
function getBoolProperty(resource, property) {
|
||||
return getValue(resource.getProperty(EM_R(property))) == "true";
|
||||
}
|
||||
|
||||
class Manifest {
|
||||
constructor(ds) {
|
||||
this.ds = ds;
|
||||
}
|
||||
|
||||
function getValue(aLiteral) {
|
||||
if (aLiteral instanceof Ci.nsIRDFLiteral)
|
||||
return aLiteral.Value;
|
||||
if (aLiteral instanceof Ci.nsIRDFResource)
|
||||
return aLiteral.Value;
|
||||
if (aLiteral instanceof Ci.nsIRDFInt)
|
||||
return aLiteral.Value;
|
||||
return null;
|
||||
static loadFromString(text) {
|
||||
return new this(RDFDataSource.loadFromString(text));
|
||||
}
|
||||
|
||||
function getProperty(aDs, aSource, aProperty) {
|
||||
return getValue(aDs.GetTarget(aSource, EM_R(aProperty), true));
|
||||
static loadFromBuffer(buffer) {
|
||||
return new this(RDFDataSource.loadFromBuffer(buffer));
|
||||
}
|
||||
|
||||
function getBooleanProperty(aDs, aSource, aProperty) {
|
||||
let propValue = aDs.GetTarget(aSource, EM_R(aProperty), true);
|
||||
if (!propValue)
|
||||
return undefined;
|
||||
return getValue(propValue) == "true";
|
||||
static async loadFromFile(uri) {
|
||||
return new this(await RDFDataSource.loadFromFile(uri));
|
||||
}
|
||||
}
|
||||
|
||||
let rdfParser = new RDFParser();
|
||||
let ds = new RDFDataSource();
|
||||
rdfParser.parseString(ds, aRequest.channel.URI, aRequest.responseText);
|
||||
class UpdateRDF extends Manifest {
|
||||
decode() {
|
||||
let addons = {};
|
||||
let result = {addons};
|
||||
|
||||
let addons = {};
|
||||
let result = {addons};
|
||||
|
||||
for (let addonRes of XPCOMUtils.IterSimpleEnumerator(ds.GetAllResources(), Ci.nsIRDFResource)) {
|
||||
let value = addonRes.ValueUTF8;
|
||||
let id;
|
||||
for (let prefix of [PREFIX_EXTENSION, PREFIX_THEME, PREFIX_ITEM]) {
|
||||
if (value.startsWith(prefix)) {
|
||||
id = value.substr(prefix.length);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!id) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let addon = {};
|
||||
addons[id] = addon;
|
||||
|
||||
let updatesTarget = ds.GetTarget(addonRes, EM_R("updates"), true);
|
||||
if (!(updatesTarget instanceof Ci.nsIRDFResource) ||
|
||||
!containerUtils.IsContainer(ds, updatesTarget)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let updates = [];
|
||||
addon.updates = updates;
|
||||
|
||||
let ctr = new RDFContainer(ds, updatesTarget);
|
||||
for (let item of XPCOMUtils.IterSimpleEnumerator(ctr.GetElements(),
|
||||
Ci.nsIRDFResource)) {
|
||||
let version = getProperty(ds, item, "version");
|
||||
|
||||
let targetApps = ds.GetTargets(item, EM_R("targetApplication"), true);
|
||||
for (let targetApp of XPCOMUtils.IterSimpleEnumerator(targetApps,
|
||||
Ci.nsIRDFResource)) {
|
||||
let appEntry = {};
|
||||
|
||||
let minVersion = getProperty(ds, targetApp, "minVersion");
|
||||
if (minVersion) {
|
||||
appEntry.strict_min_version = minVersion;
|
||||
for (let resource of this.ds.getAllResources()) {
|
||||
let id;
|
||||
let uri = resource.getURI();
|
||||
for (let prefix of [PREFIX_EXTENSION, PREFIX_THEME, PREFIX_ITEM]) {
|
||||
if (uri.startsWith(prefix)) {
|
||||
id = uri.substr(prefix.length);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!id) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let maxVersion = getProperty(ds, targetApp, "maxVersion");
|
||||
if (maxVersion) {
|
||||
if (getBooleanProperty(ds, targetApp, "strictCompatibility")) {
|
||||
appEntry.strict_max_version = maxVersion;
|
||||
} else {
|
||||
appEntry.advisory_max_version = maxVersion;
|
||||
let addon = {};
|
||||
addons[id] = addon;
|
||||
|
||||
let updatesProp = resource.getProperty(EM_R("updates"));
|
||||
if (!updatesProp || !updatesProp.getChildren) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let updates = [];
|
||||
addon.updates = updates;
|
||||
|
||||
for (let item of updatesProp.getChildren()) {
|
||||
let version = getProperty(item, "version");
|
||||
|
||||
for (let targetApp of item.getObjects(EM_R("targetApplication"))) {
|
||||
let appEntry = {};
|
||||
|
||||
let minVersion = getProperty(targetApp, "minVersion");
|
||||
if (minVersion) {
|
||||
appEntry.strict_min_version = minVersion;
|
||||
}
|
||||
}
|
||||
|
||||
let appId = getProperty(ds, targetApp, "id");
|
||||
if (!appId) {
|
||||
continue;
|
||||
}
|
||||
if (appId === TOOLKIT_ID || appId === Services.appinfo.ID) {
|
||||
appId = "gecko";
|
||||
}
|
||||
let maxVersion = getProperty(targetApp, "maxVersion");
|
||||
if (maxVersion) {
|
||||
if (getBoolProperty(targetApp, "strictCompatibility")) {
|
||||
appEntry.strict_max_version = maxVersion;
|
||||
} else {
|
||||
appEntry.advisory_max_version = maxVersion;
|
||||
}
|
||||
}
|
||||
|
||||
let update = {
|
||||
applications: {[appId]: appEntry},
|
||||
};
|
||||
if (version) {
|
||||
update.version = version;
|
||||
}
|
||||
let updateLink = getProperty(ds, targetApp, "updateLink");
|
||||
if (updateLink) {
|
||||
update.update_link = updateLink;
|
||||
}
|
||||
let updateInfoURL = getProperty(ds, targetApp, "updateInfoURL");
|
||||
if (updateInfoURL) {
|
||||
update.update_info_url = updateInfoURL;
|
||||
}
|
||||
let updateHash = getProperty(ds, targetApp, "updateHash");
|
||||
if (updateHash) {
|
||||
update.update_hash = updateHash;
|
||||
}
|
||||
let appId = getProperty(targetApp, "id");
|
||||
if (!appId) {
|
||||
continue;
|
||||
}
|
||||
if (appId === TOOLKIT_ID || appId === Services.appinfo.ID) {
|
||||
appId = "gecko";
|
||||
}
|
||||
|
||||
updates.push(update);
|
||||
let update = {
|
||||
applications: {[appId]: appEntry},
|
||||
};
|
||||
if (version) {
|
||||
update.version = version;
|
||||
}
|
||||
let updateLink = getProperty(targetApp, "updateLink");
|
||||
if (updateLink) {
|
||||
update.update_link = updateLink;
|
||||
}
|
||||
let updateInfoURL = getProperty(targetApp, "updateInfoURL");
|
||||
if (updateInfoURL) {
|
||||
update.update_info_url = updateInfoURL;
|
||||
}
|
||||
let updateHash = getProperty(targetApp, "updateHash");
|
||||
if (updateHash) {
|
||||
update.update_hash = updateHash;
|
||||
}
|
||||
|
||||
updates.push(update);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
var UpdateRDFConverter = {
|
||||
convertToJSON(request) {
|
||||
return parseRDFManifest(request);
|
||||
return UpdateRDF.loadFromString(request.responseText).decode();
|
||||
},
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user