Components.interfaces.nsiprocess2 in Firefox 3.6 - Dove è andato?
-
19-09-2019 - |
Domanda
Sto testando un'applicazione che include un'estensione Firefox come un componente. È stato originariamente distribuito quando FF3.5.5 era l'ultima versione e sopravvissuta 3.5.6 e 3.5.7. Tuttavia su FF3.6 sto ottenendo quanto segue nella mia console di errore:
Warning: reference to undefined property Components.interfaces.nsIProcess2
Source file: chrome://overthewall/content/otwhelper.js
Line: 55
Error: Component returned failure code: 0x80570018 (NS_ERROR_XPC_BAD_IID)
[nsIJSCID.createInstance]
Source file: chrome://overthewall/content/otwhelper.js
Line: 55
La funzione che lancia l'errore è:
48 function otwRunHelper(cmd, aCallback) {
49 var file =
50 Components.classes["@mozilla.org/file/local;1"].
51 createInstance(Components.interfaces.nsILocalFile);
52 file.initWithPath(otwRegInstallDir+'otwhelper.exe');
53
54 otwProcess = Components.classes["@mozilla.org/process/util;1"]
55 .createInstance(Components.interfaces.nsIProcess2);
56
57 otwProcess.init(file);
58 var params = new Array();
59 params = cmd.split(' ');
60
61 otwNextCallback = aCallback;
62 otwObserver = new otwHelperProcess();
63 otwProcess.runAsync(params, params.length, otwObserver, false);
64 }
Come puoi vedere, tutta questa funzione fa viene eseguito un file di helper exe esterno (situato da una chiave di registro) con alcuni parametri della riga di comando e imposta un osservatore in asincrono attendere una risposta ed elaborare il codice di uscita.
La linea offensiva implica che Components.interfaces.nsiprocess2 non è più definito in FF3.6. Dov'è andato? Non riesco a trovare nulla nella documentazione di Mozilla che indica che è stata cambiata nell'ultima versione.
Soluzione
Il metodo su Nsiprocess2 è stato spostato su Nsiprocess. Affinché il tuo codice funzioni in entrambe le versioni, modifica questa riga:
otwProcess = Components.classes["@mozilla.org/process/util;1"]
.createInstance(Components.interfaces.nsIProcess2);
a questo:
otwProcess = Components.classes["@mozilla.org/process/util;1"]
.createInstance(Components.interfaces.nsIProcess2 || Components.interfaces.nsIProcess);
Otterrai comunque l'avvertimento, ma l'errore andrà via e il tuo codice funzionerà bene in entrambe le versioni. Potresti anche archiviare l'interfaccia IID in una variabile e utilizzare la variabile:
let iid = ("nsIProcess2" in Components.interfaces) ?
Components.interfaces.nsIProcess2 :
Components.interfaces.nsIProcess;
otwProcess = Components.classes["@mozilla.org/process/util;1"]
.createInstance(iid);