2016-08-25 5 views
0

Я нашел где и расширение способен удалить добавочные B: Uninstall/Remove Firefox Extension programmatically?Можно ли удалить расширение Firefox?

Интересно, если тот же метод будет также работать на расширение, чтобы удалить себя (например, если он чувствует превосходное расширение, заменяет его)? Следующий кодом является моей простой адаптацией ответа на выше связанный вопрос:

Components.utils.import("resource://gre/modules/AddonManager.jsm"); 
AddonManager.getAddonByID("[email protected]", function(betteraddon) { 
    if (betteraddon) { 
     AddonManager.getAddonById("[email protected]", function(thisaddon) { 
     if (!thisaddon) { 
      // this Add-on not present? Should not happen ... 
      return; 
     } 
     if (!(thisaddon.permissions & AddonManager.PERM_CAN_UNINSTALL)) { 
      // Add-on cannot be uninstalled 
      return; 
     } 
     thisaddon.uninstall(); 
     if (thisaddon.pendingOperations & AddonManager.PENDING_UNINSTALL) { 
      // Need to restart to finish the uninstall. 
      // Might ask the user to do just that. Or not ask and just do. 
      // Or just wait until the browser is restarted by the user. 
     } 
     }); 
    } 
}); 

Это звучит опасно, как самостоятельно удалить аддон по крайней мере, ожидая возвращения на вызов от своего собственного удаления ... Но действительно ли такой подход настолько опасен? В конце концов, в настоящее время деинсталляция даже отменена, а это значит, что удаленный аддон «все еще существует» на некоторое время.?

+0

Похоже, ваш вопрос можно ответить просто попробовать его. Итак, что случилось, когда вы попробовали? – Makyen

+0

@Makyen Что-то, что работает, когда я пытаюсь это сделать на моей собственной машине в моей собственной среде, может все еще терпеть неудачу в условиях, не находящихся под моим контролем (например, условий гонки) –

ответ

2

Да, само расширение можно удалить с помощью AddonManager.jsm. Вы можете получить объект Addon, используя getAddonByID(), который имеет метод uninstall(). Другими словами, более или менее, как вы закодировали его в своем вопросе.

Ниже приведено расширение расширения SDK, которое удаляет себя. Когда он установлен, он кратко отображается в about:addons, но затем исчезает. Она производит следующий вывод в консоль при установке из файла .XPI:

uninstallself:My [email protected] 
uninstallself:This add-on is being loaded for reason= install 
uninstallself:Going to uninstall myself 
uninstallself:This add-on is being unloaded for reason= uninstall 
uninstallself:Called uninstall on myself 

Если вызывается с помощью jpm run он также выводит две дополнительные линии ошибок, которые указывают на то, что файл не может быть удален. Этот файл является временным .xpi файл создан jpm run.

package.json:

{ 
    "title": "Test Self Uninstall", 
    "name": "uninstallself", 
    "version": "0.0.1", 
    "description": "Test an add-on uninstalling itself", 
    "main": "index.js", 
    "author": "Makyen", 
    "engines": { 
     "firefox": ">=38.0a1", 
     "fennec": ">=38.0a1" 
    }, 
    "license": "MIT", 
    "keywords": [ 
     "jetpack" 
    ] 
} 

index.js:

/* Firefox Add-on SDK uninstall self */ 

const { AddonManager } = require("resource://gre/modules/AddonManager.jsm"); 
var self = require("sdk/self"); 
var myId = self.id; 

var utils = require('sdk/window/utils'); 
activeWin = utils.getMostRecentBrowserWindow(); 
// Using activeWin.console.log() is needed to have output to the 
// Browser Console when installed as an .xpi file. In that case, 
// console is mapped to dump(), which does not output to the console. 
// This is done to not polute the console from SDK add-ons that are 
// logging information when they should not. Using jpm run, 
// console.log outputs to the Browser Console. 

activeWin.console.log('My ID=' +myId); 

exports.main = function (options) { 
activeWin = utils.getMostRecentBrowserWindow(); 
    activeWin.console.log('This add-on is being loaded for reason=', options.loadReason); 
}; 

exports.onUnload = function (reason) { 
    activeWin.console.log('This add-on is being unloaded for reason=',reason); 
}; 

AddonManager.getAddonByID(myId,addon => { 
    if(addon && typeof addon.uninstall === 'function'){ 
     activeWin.console.log('Going to uninstall myself'); 
     addon.uninstall(); 
     activeWin.console.log('Called uninstall on myself'); 
    } 
});