diff options
Diffstat (limited to 'toolkit/components/webextensions/ext-management.js')
-rw-r--r-- | toolkit/components/webextensions/ext-management.js | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/toolkit/components/webextensions/ext-management.js b/toolkit/components/webextensions/ext-management.js new file mode 100644 index 0000000000..59a7959d78 --- /dev/null +++ b/toolkit/components/webextensions/ext-management.js @@ -0,0 +1,109 @@ +/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set sts=2 sw=2 et tw=80: */ +"use strict"; + +const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components; + +XPCOMUtils.defineLazyGetter(this, "strBundle", function() { + const stringSvc = Cc["@mozilla.org/intl/stringbundle;1"].getService(Ci.nsIStringBundleService); + return stringSvc.createBundle("chrome://global/locale/extensions.properties"); +}); +XPCOMUtils.defineLazyModuleGetter(this, "AddonManager", + "resource://gre/modules/AddonManager.jsm"); +XPCOMUtils.defineLazyServiceGetter(this, "promptService", + "@mozilla.org/embedcomp/prompt-service;1", + "nsIPromptService"); + +function _(key, ...args) { + if (args.length) { + return strBundle.formatStringFromName(key, args, args.length); + } + return strBundle.GetStringFromName(key); +} + +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 (err) { + reject(err); + } + })); + }, + + uninstallSelf: function(options) { + return new Promise((resolve, reject) => { + if (options && options.showConfirmDialog) { + let message = _("uninstall.confirmation.message", extension.name); + if (options.dialogMessage) { + message = `${options.dialogMessage}\n${message}`; + } + let title = _("uninstall.confirmation.title", extension.name); + let buttonFlags = promptService.BUTTON_POS_0 * promptService.BUTTON_TITLE_IS_STRING + + promptService.BUTTON_POS_1 * promptService.BUTTON_TITLE_IS_STRING; + let button0Title = _("uninstall.confirmation.button-0.label"); + let button1Title = _("uninstall.confirmation.button-1.label"); + let response = promptService.confirmEx(null, title, message, buttonFlags, button0Title, button1Title, null, null, {value: 0}); + if (response == 1) { + return reject({message: "User cancelled uninstall of extension"}); + } + } + AddonManager.getAddonByID(extension.id, addon => { + let canUninstall = Boolean(addon.permissions & AddonManager.PERM_CAN_UNINSTALL); + if (!canUninstall) { + return reject({message: "The add-on cannot be uninstalled"}); + } + try { + addon.uninstall(); + } catch (err) { + return reject(err); + } + }); + }); + }, + }, + }; +}); |