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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
/* 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",
"chrome://legacy/content/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;
}
}
|