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.

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top