Pregunta

Estoy probando una aplicación que incluye una extensión de Firefox como un componente. Originalmente se implementó cuando FF3.5.5 fue la última versión, y sobrevivió 3.5.6 y 3.5.7. Sin embargo, en FF3.6 obtengo lo siguiente en mi consola de error:

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 función que arroja el error es:

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 }

Como puede ver, todo lo que hace esta función es ejecutar un archivo exe auxiliar exe externo (ubicado por una clave de registro) con algunos parámetros de línea de comandos y establece un observador para esperar asincrónicamente una respuesta y procesar el código de salida.

La línea ofensiva implica que Componentes.interfaces.nsiprocess2 ya no se define en FF3.6. ¿A donde se fué? No puedo encontrar nada en la documentación de Mozilla que indique que se ha cambiado en el último lanzamiento.

¿Fue útil?

Solución

El método en nsiprocess2 se movió al nsiprocess. Para que su código funcione en ambas versiones, cambie esta línea:

otwProcess = Components.classes["@mozilla.org/process/util;1"]
                .createInstance(Components.interfaces.nsIProcess2);

a esto:

otwProcess = Components.classes["@mozilla.org/process/util;1"]
                .createInstance(Components.interfaces.nsIProcess2 || Components.interfaces.nsIProcess);

Todavía obtendrá la advertencia, pero el error desaparecerá y su código funcionará bien en ambas versiones. También puede almacenar la interfaz IID en una variable y usar la variable:

let iid = ("nsIProcess2" in Components.interfaces) ?
  Components.interfaces.nsIProcess2 :
  Components.interfaces.nsIProcess;
otwProcess = Components.classes["@mozilla.org/process/util;1"]
                .createInstance(iid);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top