gecko-dev/toolkit/components/extensions/ext-management.js

62 lines
2 KiB
JavaScript

/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
XPCOMUtils.defineLazyModuleGetter(this, "AddonManager",
"resource://gre/modules/AddonManager.jsm");
function installType(addon) {
if (addon.temporarilyInstalled) {
return "development";
} else if (addon.foreignInstall) {
return "sideload";
} else if (addon.isSystem) {
return "other";
}
return "normal";
}
extensions.registerSchemaAPI("management", "addon_parent", context => {
let {extension} = context;
return {
management: {
getSelf: function() {
return new Promise((resolve, reject) => AddonManager.getAddonByID(extension.id, addon => {
try {
let m = extension.manifest;
let extInfo = {
id: extension.id,
name: addon.name,
shortName: m.short_name || "",
description: addon.description || "",
version: addon.version,
mayDisable: !!(addon.permissions & AddonManager.PERM_CAN_DISABLE),
enabled: addon.isActive,
optionsUrl: addon.optionsURL || "",
permissions: Array.from(extension.permissions).filter(perm => {
return !extension.whiteListedHosts.pat.includes(perm);
}),
hostPermissions: extension.whiteListedHosts.pat,
installType: installType(addon),
};
if (addon.homepageURL) {
extInfo.homepageUrl = addon.homepageURL;
}
if (addon.updateURL) {
extInfo.updateUrl = addon.updateURL;
}
if (m.icons) {
extInfo.icons = Object.keys(m.icons).map(key => {
return {size: Number(key), url: m.icons[key]};
});
}
resolve(extInfo);
} catch (e) {
reject(e);
}
}));
},
},
};
});