123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- /* 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/. */
- module.metadata = {
- "stability": "experimental"
- };
- const { Cc, Ci, Cu } = require("chrome");
- const { AddonManager } = Cu.import("resource://gre/modules/AddonManager.jsm");
- const { defer } = require("../core/promise");
- const { setTimeout } = require("../timers");
- /**
- * `install` method error codes:
- *
- * https://developer.mozilla.org/en/Addons/Add-on_Manager/AddonManager#AddonInstall_errors
- */
- exports.ERROR_NETWORK_FAILURE = AddonManager.ERROR_NETWORK_FAILURE;
- exports.ERROR_INCORRECT_HASH = AddonManager.ERROR_INCORRECT_HASH;
- exports.ERROR_CORRUPT_FILE = AddonManager.ERROR_CORRUPT_FILE;
- exports.ERROR_FILE_ACCESS = AddonManager.ERROR_FILE_ACCESS;
- /**
- * Immediatly install an addon.
- *
- * @param {String} xpiPath
- * file path to an xpi file to install
- * @return {Promise}
- * A promise resolved when the addon is finally installed.
- * Resolved with addon id as value or rejected with an error code.
- */
- exports.install = function install(xpiPath) {
- let { promise, resolve, reject } = defer();
- // Create nsIFile for the xpi file
- let file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
- try {
- file.initWithPath(xpiPath);
- }
- catch(e) {
- reject(exports.ERROR_FILE_ACCESS);
- return promise;
- }
- // Listen for installation end
- let listener = {
- onInstallEnded: function(aInstall, aAddon) {
- aInstall.removeListener(listener);
- // Bug 749745: on FF14+, onInstallEnded is called just before `startup()`
- // is called, but we expect to resolve the promise only after it.
- // As startup is called synchronously just after onInstallEnded,
- // a simple setTimeout(0) is enough
- setTimeout(resolve, 0, aAddon.id);
- },
- onInstallFailed: function (aInstall) {
- console.log("failed");
- aInstall.removeListener(listener);
- reject(aInstall.error);
- },
- onDownloadFailed: function(aInstall) {
- this.onInstallFailed(aInstall);
- }
- };
- // Order AddonManager to install the addon
- AddonManager.getInstallForFile(file, function(install) {
- install.addListener(listener);
- install.install();
- });
- return promise;
- };
- exports.uninstall = function uninstall(addonId) {
- let { promise, resolve, reject } = defer();
- // Listen for uninstallation end
- let listener = {
- onUninstalled: function onUninstalled(aAddon) {
- if (aAddon.id != addonId)
- return;
- AddonManager.removeAddonListener(listener);
- resolve();
- }
- };
- AddonManager.addAddonListener(listener);
- // Order Addonmanager to uninstall the addon
- getAddon(addonId).then(addon => addon.uninstall(), reject);
- return promise;
- };
- exports.disable = function disable(addonId) {
- return getAddon(addonId).then(addon => {
- addon.userDisabled = true;
- return addonId;
- });
- };
- exports.enable = function enabled(addonId) {
- return getAddon(addonId).then(addon => {
- addon.userDisabled = false;
- return addonId;
- });
- };
- exports.isActive = function isActive(addonId) {
- return getAddon(addonId).then(addon => addon.isActive && !addon.appDisabled);
- };
- function getAddon (id) {
- let { promise, resolve, reject } = defer();
- AddonManager.getAddonByID(id, addon => addon ? resolve(addon) : reject());
- return promise;
- }
|